使用空合并运算符“??”将自动实现的 属性 分配给自身

Assigning auto-implemented property to itself with null coalescing operator "??"

我有一个自动实现的 属性,它采用默认值。 属性 从数据库中读取它的值,但如果它是空的,它应该采用它的默认值。

    // Variable Declaration
    public bool IsSoundEffects { get; set; } = true;

    // Usage
    bool? readFromDB = null;    // Get it from Database assume its NULL
    IsSoundEffects = readFromDB ?? IsSoundEffects;

如果先前的数据库读取结果为空,则将 IsSoundEffects 分配给自己是一种常见做法吗?

应该怎么做才能使这段代码井井有条且易于阅读?

你做的很好。作为替代方案,GetValueOrDefault 也可以。

IsSoundEffects = readFromDb.GetValueOrDefault(IsSoundEffects);

如果您的 readFromDb 确实是一个带有参数的方法,那么这些都是很好的解决方案,因为您可以使用如下所示的简洁语法

IsSoundEffects = readFromDb(some, parameters).GetValueOrDefault(IsSoundEffects);
IsSoundEffects = readFromDb(some, parameters) ?? IsSoundEffects;

在将 ?? 运算符引入 C# 之前,前者是您唯一的选择。

如果 "assign to self" 令人反感,则避免初始赋值,并在其他地方明确执行,例如

public bool IsSoundEffects { get; set; }
...
IsSoundEffects = readFromDb(some, parameters).GetValueOrDefault(true);
IsSoundEffects = readFromDb(some, parameters) ?? true;

简单点

if(readFromDB != null) IsSoundEffects = readFromDB;

这样就可以避免在readFromDB为null时赋值相同