C# 文字列「参照型」例外
C# ドキュメントには、文字列は参照型であると記載されています。ただし、以下のコードは混乱を招く動作を示します:
<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>
参照型の定義によれば、出力は「通過前」と「通過後」である必要があり、これは文字列が TestI メソッドで変更されたことを示します。ただし、実際の出力は「通過前」と「通過前」であり、文字列が参照ではなく値によって渡されることを示します。
この例外を理解するには、参照型の微妙な点を詳しく調べる必要があります。文字列は技術的には参照型ですが、参照自体は値によって渡されます。参照を値で渡すということは、オブジェクト自体ではなく、参照を含む変数がコピーされることを意味します。したがって、メソッド内部の参照を変更しても、メソッド外部の元の文字列には影響しません。
これを修正して文字列を変更できるようにするには、「ref」キーワードを使用して参照を渡す必要があります。
<code class="language-csharp">public static void TestI(ref string test)</code>
TestI メソッド内の参照への変更は、メソッド外の元の文字列に反映されるようになります。
変数が参照するオブジェクトの変更と参照自体の変更の違いに注意することが重要です。文字列は不変です。つまり、その内容は変更できません。ただし、次の StringBuilder の例に示すように、参照変数を別の文字列を指すように再割り当てできます。
<code class="language-csharp">using System.Text; class Test { public static void Main() { StringBuilder test = new StringBuilder(); Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(StringBuilder test) { test.Append("changing"); } }</code>
以上がC# の文字列の動作が参照型の分類と矛盾しているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。