检查Null运算符是否深入

时间:2014-02-24 08:12:12

标签: c#

这是带有null运算符的语句。

this.Str = this.Str ?? "test";

我知道当str为null时,“test”字符串值将被设置为str变量。

到目前为止一直很好,但实际的问题是当str首先不为空时会发生什么。

如果str不为空,是否会发生这种情况?

this.Str = this.Str

这意味着无论如何都会被召唤,对吗?此外,即使值没有改变,我也会调用setter中的自定义逻辑,对吗?

我希望如果str不为null,则不会使用相同的值调用setter。

有人对此有深入了解吗?

很抱歉,如果这是重复的,请在评论中告诉我,我将删除此问题。

2 个答案:

答案 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 = "";