C# 文字列参照型? 質問する

C# 文字列参照型? 質問する

C# の「文字列」は参照型であることはわかっています。これは MSDN にあります。ただし、次のコードは期待どおりに動作しません。

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";
    }
}

文字列をパラメータとして渡し、それが参照型であるため、出力は「渡す前」「渡した後」になるはずです。2 番目の出力ステートメントは、TestI メソッドでテキストが変更されたことを認識する必要があります。ただし、「渡す前」「渡す前」が表示されるため、参照ではなく値で渡されたように見えます。文字列は不変であることは理解していますが、それがここで何が起こっているのか説明できません。何が足りないのでしょうか? ありがとうございます。

ベストアンサー1

文字列への参照は値によって渡されます。参照を値で渡すこととオブジェクトを参照で渡すことには大きな違いがあります。両方の場合に「参照」という単語が使用されているのは残念です。

もし、あんたがする文字列参照を渡すによる参照すると、期待どおりに動作します。

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";
    }
}

ここで、参照が参照するオブジェクトに変更を加えることと、変数 (パラメーターなど) を変更して別のオブジェクトを参照できるようにすることを区別する必要があります。文字列は不変であるため、文字列を変更することはできませんが、代わりに を使用してそれを実証できますStringBuilder

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)
    {
        // Note that we're not changing the value
        // of the "test" parameter - we're changing
        // the data in the object it's referring to
        test.Append("changing");
    }
}

見るパラメータ渡しに関する私の記事詳細については。

おすすめ記事