C#对象参考:我该怎么做?

时间:2013-05-09 11:41:45

标签: c# pointers

这是课程测试

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 = ""

3 个答案:

答案 0 :(得分:7)

如果我理解正确,您希望链接变量mytest.myStr,那么如果其中一个发生了变化,那么其他变化会发生变化吗?

答案很简单:它不能!

字符串是不可变的类。多个引用可以指向字符串实例,但是一旦修改了此实例,就会使用新值创建字符串实例。因此,为变量分配了新的引用,而其他变量仍然指向其他实例。

有一些解决方法,但我怀疑你会对它不满意:

public class Test
{
    public string mystr;
}

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

现在,如果您更改myTest1.myStr,变量myTest2.myStr也会被修改,但这只是因为myTest1myTest2是相同的实例。

还有其他类似的解决方案,但所有这些都归结为同一方面:一个持有字符串引用的类。

答案 1 :(得分: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

答案 2 :(得分:0)

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

请注意,您的Test类与字符串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 = "";