Does the string reference type in C# contradict code behavior?
In C#, strings are reference types, as documented by MSDN. However, the following code raises a confusing issue that seems to challenge this concept:
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(string test) { test = "after passing"; } }</code>
Depending on the behavior of reference types, one would expect the console to output "before passing" and then "after passing". This is because the string test
is passed by reference to the TestI
method, and any changes made to the string within that method should be reflected back to the caller.
However, the code actually results in the output: "before passing" "before passing", which indicates that the string is passed by value. This behavior contradicts the documented reference type for strings in C#.
Misunderstanding: Pass by reference vs. pass by reference
The confusion arises from the subtle difference between passing a reference by value and passing an object by reference. In C#, parameters are always passed by value, regardless of their data type.
When a reference type is passed to a method, the value passed is itself a reference, hence the term "pass by reference". However, this does not mean that the object referenced by the variable is also passed by reference.
In the example above, the value passed to the TestI
method is a copy of the reference to the string "before passing". Any changes made to this copy of the reference within the method will not affect the original reference outside the method.
Pass reference by reference: ref keyword
To actually pass a reference type by reference, the ref
keyword must be used. This keyword indicates that the parameter is a reference to an existing variable and any changes made to the parameter within the method will be reflected in the original variable.
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(ref test); Console.WriteLine(test); } public static void TestI(ref string test) { test = "after passing"; } }</code>
By including the ref
keyword, the code now runs as expected, outputting "before passing" and "after passing" because the TestI
method modifies the original string referenced by the test
variable.
The above is the detailed content of Why Does C#'s String Reference Type Seem to Behave Like a Value Type When Passed to a Method?. For more information, please follow other related articles on the PHP Chinese website!