2

これはクラステストです

public class Test
{
    public string mystr;
}

そして、私はメソッドからそれを呼び出します:

  string my = "ABC";
  Test test = new Test();
  test.mystr = my;
  test.mystr = "";

上記のビット コードの結果は次のとおりですmy = "ABC"test.mystr = ""

変更時にmy空の文字列に設定するにはどうすればよいですか?""test.mystr = ""

4

3 に答える 3

7

私の理解が正しければ、変数mytest.myStrリンクしたいので、一方が変わればもう一方も変わるのですか?

答えは簡単です。

文字列は不変クラスです。複数の参照で文字列インスタンスを指すことができますが、このインスタンスが変更されると、文字列インスタンスが新しい値で作成されます。そのため、新しい参照が変数に割り当てられますが、他の変数は引き続き他のインスタンスを指しています。

回避策はありますが、満足できないと思います。

public class Test
{
    public string mystr;
}

Test myTest1 = new Test { myStr = "Hello" };
Test myTest2 = myTest1;

ここで、 を変更するmyTest1.myStrと、変数myTest2.myStrも変更されますが、それは単にmyTest1myTest2が同じインスタンスであるためです。

これらのような解決策は他にもありますが、すべて同じ側面に帰着します: 文字列への参照を保持するクラス。

于 2013-05-09T11:47:15.997 に答える
2

.NET の文字列は不変であり、そのようには機能しません。試すことができる 1 つのアプローチは、文字列に変更可能なラッパーを使用することです。

public class StringReference
{
   public string Value {get; set;}

   public StringReference(string value)
   {
      Value = value;
   }
}

public class Test
{
    internal StringReference mystr;
}

StringReference my = new StringReference("ABC");
Test test = new Test();
test.mystr = my;
test.mystr.Value = "";
// my.Value is now "" as well
于 2013-05-09T11:47:57.233 に答える
0
string my = "ABC";
Test test = new Test();

ここで、Testクラスと string の間に関係がないことに注意してくださいmy。あなたが達成しようとしていることは完全にはわかりませんが、次のようにすることができます。

public class Test
{
    private string _mystr;
    private Action<string> _action;

    public Test(Action<string> action)
    {
        _action = action;
    }

    // Let's make mystr a property
    public string mystr
    {
        get { return _mystr; }
        set
        {
            _mystr = value;
            _action(_mystr);
        }
    }
}

今、あなたはこれを行うことができます:

string my = "ABC";
Test test = new Test((mystr) => { if(string.IsNullOrEmpty(mystr)) my = ""; });
test.mystr = my;
test.mystr = "";
于 2013-05-09T11:48:34.763 に答える