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>
文字列は参照型ですが、このコードの 2 番目の出力は変更されていません。これは、値による参照の受け渡しと参照によるオブジェクトの受け渡しの違いによるものです。
参照を値で渡すということは、参照自体をコピーすることを意味し、メソッド内の変更は元の変数には影響しません。オブジェクトを参照渡しすると参照自体が変更され、メソッド内の変更は元の変数に反映されます。
文字列が期待どおりに機能するには、(ref
キーワードを使用して) 文字列を参照によって渡す必要があります。
<code class="language-csharp">using System; 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>
変更されたコードの出力は次のとおりです:
<code>输入:before passing 输出:after passing</code>
これは、基礎となるオブジェクトを変更することと同じではありません。 C# の文字列は不変であり、その内容は変更できません。ただし、参照によってオブジェクト (例: StringBuilder
) を渡し、そのデータを変更することはできます:
<code class="language-csharp">using System; 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" 参数的值。 // 我们改变的是它所引用的对象中的数据。 test.Append("changing"); } }</code>
このコードの出力は次のとおりです:
<code>输入: 输出:changing</code>
要約すると、C# で文字列を操作する場合、値による参照の受け渡しと参照によるオブジェクトの受け渡しの違いを理解することが重要です。適切なメソッドを採用することで、コードの期待どおりの動作を実現できます。
以上がC# メソッドで文字列を変更しても元の文字列が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。