在设置某些属性时,我遵循一种模式,即检查相应字段是否为空,如果为空则返回该字段,如果为空则设置该字段。例如,我经常使用它来读取配置设置,这样设置就会被惰性地读取,并且只被读取一次。下面是一个例子:

private string DatabaseId
{
    get
    {
        if (string.IsNullOrEmpty(databaseId))
        {
            databaseId = CloudConfigurationManager.GetSetting("database");
        }

        return databaseId;
    }
}

我已经开始使用C 6自动属性初始化,因为它真正清理并使我的代码更简洁。我想这样做:
private string DatabaseId { get; } = CloudConfigurationManager.GetSetting("database");

但我不确定编译器在这种情况下是如何解释的。这是否与我的第一个代码块具有相同的效果,设置(自动实现)字段一次,然后从字段中读取?或者每次我得到CloudConfigurationManager时都会呼叫DatabaseId

最佳答案

展示内容:

private string DatabaseId { get; } = CloudConfigurationManager.GetSetting("database");

是一个“auto property initializer”,关键字是“initializer”,来自MSDN Blogs: C# : The New and Improved C# 6.0
自动属性初始值设定项允许直接在其声明中分配属性。对于只读属性,它负责确保属性不可变所需的所有仪式。
初始化器每个实例运行一次(对于静态成员,每个类型运行一次)。见AA>
对于实例字段,变量初始值设定项对应于创建类实例时执行的赋值语句。
所以代码编译成这样:
public class ContainingClass
{
    private readonly string _databaseId;
    public string DatabaseId { get { return _databaseId; } }

    public ContainingClass()
    {
        _databaseId = CloudConfigurationManager.GetSetting("database");
    }
}

对于静态变量,这种情况看起来是一样的:
private static string DatabaseId { get; } = CloudConfigurationManager.GetSetting("database");

编译成,或多或少:
public class ContainingClass
{
    private static readonly string _databaseId;
    public static string DatabaseId { get { return _databaseId; } }

    static ContainingClass()
    {
        _databaseId = CloudConfigurationManager.GetSetting("database");
    }
}

尽管不完全如此,当类型没有静态构造函数时,“静态字段初始值设定项在第一次使用该类的静态字段之前的依赖于实现的时间执行”。

关于c# - C#6自动属性-读取一次还是每次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32052010/

10-11 07:59
查看更多