我刚刚发现了一种非常奇怪的行为。我有一个带字符串属性的类。在这个属性的setter中,我首先将旧值与新值进行比较,如果值不同,则仅更改属性:
set
{
if ((object.ReferenceEquals(this.Identifier, value) != true))
{
this.Identifier = value;
this.RaisePropertyChanged("Identifier");
}
}
但是这个ReferenceEquals几乎总是返回false!即使我在Quick Watch中调用 object.ReferenceEquals(“test”,“test”),我也会得到错误。
这怎么可能?
答案 0 :(得分:0)
那是因为C#中的strings are immutable:
字符串对象的内容不能 在对象之后被更改 创建,虽然语法成功 好像你可以这样做。
由于您无法修改现有的字符串引用,因此重用它们没有任何好处。传递给属性设置器的值将始终是新的字符串引用,除非您执行this.Identifier = this.Identifier;
。
我将尝试用一个例子来澄清:
string s = "Hello, "; // s contains a new string reference.
s += "world!"; // s now contains another string reference.