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 中的字符串是不可变的,不能那样工作。您可以尝试的一种方法是对字符串使用可变包装器。

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请注意,您的class 和 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 回答