In C#, for what I know, the passage of the parameters during a method call is by value. BUT when you use an object as an argument, what you pass is the reference of the object itself. This means that if you access (and modify) the value of a field inside an object, the updates will be seen once the method call is finished too.

So, if I modify the value of a String inside a method, it should be modified when the method call is terminated (since String is an object in C#). But this isn't true, in fact if I write:

```
public static void main (String []args){
  String s= "hello";
  method(s);
  System.Console.Writeline(s);
}

public void method (String s)
{s = "world";}

```

It will print "hello", and not "world". The only way to print "world" is to add the keyword `ref` in the method signature and call.

Why this happens? My answer (which I'd like that you confirm or correct) is that in C# String objects are immutable, so if I make s="world" actually the compiler is creating a new string object, but the reference to the object String s doesn't change (since the passage is by value). 

In fact, if I print `s.getHashCode()` just before and after `method()` call, the two values are different.

What do you think about my explanation?