gpt4 book ai didi

C# 6 自动属性 ​​- 读取一次还是每次?

转载 作者:可可西里 更新时间:2023-11-01 08:18:00 25 4
gpt4 key购买 nike

我在设置某些属性时遵循一种模式,即检查相应的字段是否为空,如果不是则返回该字段,如果是则设置它。例如,我经常使用它来读取配置设置,以便延迟读取设置并且只读取一次。这是一个例子:

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

return databaseId;
}
}

我已经开始使用 C# 6 自动属性初始化,因为它确实清理并使我​​的代码更简洁。我想做这样的事情:

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

但我不确定编译器在这种情况下如何解释它。这是否与我的第一段代码具有相同的效果,即设置(自动实现的)字段一次,然后从该字段读取?还是每次我获得 DatabaseId 时都会调用 CloudConfigurationManager

最佳答案

你展示的内容:

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

是一个“Auto-Property Initializer”,关键字是“initializer”,来自MSDN Blogs: C# : The New and Improved C# 6.0 :

The auto-property initializer allows assignment of properties directly within their declaration. For read-only properties, it takes care of all the ceremony required to ensure the property is immutable.

初始化器对每个实例运行一次(或对静态成员每个类型运行一次)。参见 C# Language Specification, 10.4.5 Variable initializers :

For instance fields, variable initializers correspond to assignment statements that are executed when an instance of the class is created.

所以代码编译成这样:

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# 6 自动属性 ​​- 读取一次还是每次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com