ホームページ > バックエンド開発 > C++ > C# の文字列の動作が参照型の分類と矛盾しているように見えるのはなぜですか?

C# の文字列の動作が参照型の分類と矛盾しているように見えるのはなぜですか?

Linda Hamilton
リリース: 2025-01-24 07:16:09
オリジナル
419 人が閲覧しました

Why Does C# String Behavior Seem to Contradict its Reference Type Classification?

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>
ログイン後にコピー
この例では、「test」パラメータの値を変更する代わりに、それが参照するオブジェクト内のデータを変更します。

以上がC# の文字列の動作が参照型の分類と矛盾しているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート