2
    public void MethodSample1(Itest variable)
    {
        variable.TestString = "some sample data";
        Itest var1 = variable;
        Console.WriteLine(variable.TestString);
        MethodSample2(variable);
        Console.WriteLine(variable.TestString);
        Console.WriteLine(var1.TestString);

    }

    public void MethodSample2(Itest variable)
    {
        variable.TestString = "testdata";
    }

    public interface Itest
    {
      string TestString { get; set; }
    }

両方のコンソール出力行に「いくつかのサンプル データ」が出力されるTestStringはずですが、新しい値で上書きされているように見えますか? 「C#ではデフォルトですべての値が値渡しされるのですか?」のようではありませんか?

つまり、「TestString」の値を保持する方法はMethodSample1?

(すべてのプロジェクトが単一のインターフェースに基づいているため、この問題に遭遇しました)

値を保持した後でも反映されます。変!

4

3 に答える 3

5

現在の問題については、メソッドが渡されたパラメーターを変更するのを防ぐことはできないと思います。

あなたvariable参照型オブジェクトです。C# では、参照型のアドレスは値によってメソッドに渡されます。そのため、変更が見られます。たとえば、メソッドが次のように記述されている場合:

public void MethodSample2(Itest variable)
{
    variable = null;
}

参照アドレスは値で渡されるため、メソッドに変化は見られませんMethodSample1

「C#ではデフォルトですべての値が値渡しされるのですか?」のようではありませんか?

値型は値で渡されます。あなたの場合variableは参照型です。

Jon Skeet による Parameter Passing C# が表示されます。

渡されたオブジェクトを変更する必要がある理由がわかりません。回避策 として、プロパティの一時コピーを作成し、メソッドから存在する前にその値を設定できます。

于 2013-01-09T09:37:32.657 に答える
2

パラメータは確かに値で渡されますが、渡す値は元のオブジェクトへの 参照です。

元のオブジェクトのプロパティを保持したい場合は、元のオブジェクトのコピーを渡す必要があります。Clone() メソッドをインターフェイスまたは同様のものに追加できます。

public interface ITest
{
    string TestString { get; set; }
    ITest Clone();      
}

public class Test : ITest 
{
    string TestString { get; set; }
    ITest Clone() { 
        return new Test() { 
            TestString = this.TestString 
        }; 
    }
}

または、現在のアプローチを再考することもできます。本当にインターフェイスのプロパティを変更する必要がありますか? または、代わりに文字列型の変数を使用できますか?

于 2013-01-09T09:37:45.227 に答える
1

MethodSample1で「TestString」の値を保持する方法は?

ローカル変数に格納します。

public void MethodSample1(Itest variable)
{
    variable.TestString = "some sample data";
    string localTestString = variable.TestString;

    Console.WriteLine(variable.TestString);

    MethodSample2(variable);
    variable.TestString = localTestString;

    Console.WriteLine(variable.TestString);

}

しかし、これは間違ったやり方です。達成したいことをもう少し教えていただければ、より多くのことをお手伝いできます。

于 2013-01-09T09:39:55.213 に答える