C# の文字列が場合によっては参照型のように機能しないのはなぜですか?
文字列は C# では参照型として定義されていますが、特定のコード シナリオでは動作が異なります。次のコードを考えてみましょう:
<code class="language-csharp">class Test { public static void Main() { string test = "传递前"; Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(string test) { test = "传递后"; } }</code>
このコードの期待される出力は、文字列の参照の性質を反映して、「通過前」と「通過後」です。ただし、実際の出力は両方の行が「前に渡される」というもので、参照ではなく値によって渡されることを示しています。
この違いの理由は、C# での参照の処理方法にあります。文字列型は確かに参照型ですが、参照がパラメータとしてメソッドに渡される場合、値によって渡されます。これは、元の値への参照ではなく、参照のコピーが作成されることを意味します。
文字列を参照によって渡したい場合は、「ref」キーワードを使用する必要があります:
<code class="language-csharp">public static void TestI(ref string test)</code>
これにより、メソッドが元の文字列への参照を確実に受け取り、メソッド内で行われた変更を呼び出し元のコードに反映できるようになります。
参照オブジェクトの値の変更と参照自体の変更を区別することが重要です。文字列は不変で変更できませんが、参照を別の文字列に再割り当てすることはできます。
より明確に示すために、可変型 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("修改"); } }</code>
この場合、出力は「」と「modified」になります。これは、メソッドで行われた変更が呼び出し元のコードに反映されていることを示します。これは、StringBuilder が変更可能な参照型であるためです。
以上がなぜC#文字列の動作は、その参照タイプの性質と矛盾しているように見えるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。