这是带有null运算符的语句。
this.Str = this.Str ?? "test";
我知道当str为null时,“test”字符串值将被设置为str变量。
到目前为止一直很好,但实际的问题是当str首先不为空时会发生什么。
如果str不为空,是否会发生这种情况?
this.Str = this.Str
这意味着无论如何都会被召唤,对吗?此外,即使值没有改变,我也会调用setter中的自定义逻辑,对吗?
我希望如果str不为null,则不会使用相同的值调用setter。
有人对此有深入了解吗?
很抱歉,如果这是重复的,请在评论中告诉我,我将删除此问题。
答案 0 :(得分:5)
将召唤塞特。这里有两个运算符 - null-coalescing 运算符,它首先执行并计算为Str
getter或"test"
字符串返回的值。第二个运算符是赋值运算符,它将计算值传递给Str
setter。
如果您不想要执行自定义逻辑,请手动检查指定的值:
public string Str
{
get { returns _str; }
set
{
if (_str == value)
return;
_str = value;
// custom logic
}
}
这将允许您仅在属性值更改时运行自定义逻辑,而不是每次向属性分配内容时运行自定义逻辑。
答案 1 :(得分:2)
你是对的。在这种情况下,始终会调用setter。即使值相同,您也必须能够进行验证。
另一件事,如果字符串不是null但是空,你可以试试这个:
this.Str = !string.IsNullOrEmpty(this.Str) ? this.Str : "test";
此代码适用于:
this.Str = null;
this.Str = "";