这是课程测试
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 = ""
?
答案 0 :(得分:7)
如果我理解正确,您希望链接变量my
和test.myStr
,那么如果其中一个发生了变化,那么其他变化会发生变化吗?
答案很简单:它不能!
字符串是不可变的类。多个引用可以指向字符串实例,但是一旦修改了此实例,就会使用新值创建字符串实例。因此,为变量分配了新的引用,而其他变量仍然指向其他实例。
有一些解决方法,但我怀疑你会对它不满意:
public class Test
{
public string mystr;
}
Test myTest1 = new Test { myStr = "Hello" };
Test myTest2 = myTest1;
现在,如果您更改myTest1.myStr
,变量myTest2.myStr
也会被修改,但这只是因为myTest1
和myTest2
是相同的实例。
还有其他类似的解决方案,但所有这些都归结为同一方面:一个持有字符串引用的类。
答案 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 = "";