C#:初始化要通过属性公开的成员变量

CSh*_*ned 2 c#

我刚刚编写了一小段代码,让我感到震惊的是,在初始化我将通过属性公开和使用的成员变量时,我不确定哪种初始化方法是最佳实践.从以下两个示例中初始化我的成员变量的最佳方法是哪种,更重要的是为什么

例1:

    private string m_connectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
    private string m_providerName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;

    public string ConnectionString
    {
        get { return m_connectionString; }
        set { m_connectionString = value; }
    }

    public string ProviderName
    {
        get { return m_providerName; }
        set { m_providerName = value; }
    }

    public EntityClusterRefreshServiceDatabaseWorker()
    {
    }
Run Code Online (Sandbox Code Playgroud)

例2:

    private string m_connectionString;
    private string m_providerName;

    public string ConnectionString
    {
        get { return m_connectionString; }
        set { m_connectionString = value; }
    }

    public string ProviderName
    {
        get { return m_providerName; }
        set { m_providerName = value; }
    }

    public EntityClusterRefreshServiceDatabaseWorker()
    {
        ConnectionString = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ConnectionString;
        ProviderName = ConfigurationManager.ConnectionStrings["ApplicationDefault"].ProviderName;
    }
Run Code Online (Sandbox Code Playgroud)

注意:假设我没有在静态上下文中使用这些变量.

Jon*_*eet 8

除了在基类构造函数调用重写成员的非常奇怪的情况下,在这种情况下,时序会改变:实例变量初始化器基类构造函数调用之前运行,这显然无关紧要.之后执行构造函数体.

在后一种情况下,您可以使用自动实现的属性使代码更简单:

public string ConnectionString { get; set; }
public string ProviderName { get; set; }

public EntityClusterRefreshServiceDatabaseWorker()
{
    // Code as before
    ConnectionString = ...;
    ProviderName = ...;
}
Run Code Online (Sandbox Code Playgroud)

您无法使用第一个表单执行此操作,因为自动实现的属性无法指定初始值.

(您可能需要考虑使制定者私有的,但是这是一个独立的问题.)

  • @CSharpened减少代码行和提高可读性是合理的; p (2认同)