c# - 深入检查 Null 运算符

标签 c#

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

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

我知道当 str 为空时,“测试”字符串值将设置为 str 变量。

到目前为止一切顺利,但真正的问题是当 str 不为 null 时会发生什么。

如果 str 不为空,这是否会在幕后发生?

this.Str = this.Str

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

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

有人对此有深入的了解吗?

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

最佳答案

Setter 将被调用。这里有两个运算符 - null-coalescing 运算符,它首先执行并评估为 Str getter 或 "test" 字符串返回的值。第二个运算符是赋值运算符,它将评估的值传递给Str setter。

如果您不想执行自定义逻辑,请手动检查分配的值:

public string Str
{
    get { returns _str; }
    set
    {
        if (_str == value)
            return;

        _str = value;
        // custom logic
    }
}

这将允许您仅在属性值更改时运行自定义逻辑,而不是每次您为属性赋值时。

关于c# - 深入检查 Null 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21982206/

相关文章:

c# - 在使用 Entity Framework 的分层架构中,我应该从 BLL 返回 POCO 类吗? (需要架构指导)

c# - 在 Moq 中分配 out/ref 参数

c# - 可以在 IIS 中对静态 html 页面进行后处理吗?

c# - 循环中从 CryptoStream 获取字符串

c# - 在 c# 应用程序中禁用 messagebox.show()

c# - 将 IQueryable<EntityObject> 转换为 IQueryable<Specific>

c# - 无法将 C++ 中的 TextBox_TextChanged() 转换为 C#

c# - 为什么不能在静态类中重载运算符?

c# - 延迟删除 aws s3 中的单个对象

c# - 更改此函数,使 cookie 过期为 30 秒