If you are planning on changing the value of an argument to a method you should really use the "ref" or "out" keywords. Otherwise you risk making confusing methods that may or may not do what you intend. As other have pointed out you are changing the value of the string reference and not the instance of the object. To see how this works with other classes I have written a quick example
static void Main(string[] args)
{
var str = "String";
var obj = new MyObject() { Value = "Object" };
Console.WriteLine(str); //String
Console.WriteLine(obj); //Object
ChangeMe(str);
ChangeMe(obj);
Console.WriteLine(str); //String
Console.WriteLine(obj); //Object
ChangeMeInner(obj);
// this is where it can get confusing!!!
Console.WriteLine(obj); //Inner
ChangeMe(ref str);
ChangeMe(ref obj);
Console.WriteLine(str); // Changed
Console.WriteLine(obj); // Changed
Console.Read();
}
class MyObject
{
public string Value { get; set; }
public override string ToString()
{
return Value;
}
}
static void ChangeMe(MyObject input)
{
input = new MyObject() { Value = "Changed" };
}
static void ChangeMeInner(MyObject input)
{
input.Value = "Inner";
}
static void ChangeMe(string input)
{
input = "Changed";
}
static void ChangeMe(ref MyObject input)
{
input = new MyObject() { Value = "Changed" };
}
static void ChangeMe(ref string input)
{
input = "Changed";
}