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

时间:2012-06-27 08:15:58

标签: 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()
    {
    }

示例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;
    }

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

4 个答案:

答案 0 :(得分:8)

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

在后一种情况下,尽管使用automatically implemented properties

,您仍可以使代码更简单
public string ConnectionString { get; set; }
public string ProviderName { get; set; }

public EntityClusterRefreshServiceDatabaseWorker()
{
    // Code as before
    ConnectionString = ...;
    ProviderName = ...;
}

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

(你可能想要考虑让私人设定者,但这是一个单独的问题。)

答案 1 :(得分:1)

你基本上做同样的事情,但以不同的形式写。

我总是喜欢(并使用)第二个方法,因为我不喜欢在不知名的地方执行的方法。分裂事情更好。属性在类主体上声明,并在类构造函数上初始化。

答案 2 :(得分:1)

只要不应更改连接字符串,就可以将它们初始化为static readonly

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

只允许在类声明/构造函数中初始化readonly变量,并且比常规私有变量更好地优化性能。

回到这个问题 - 你在哪里初始化它们并不重要。

答案 3 :(得分:0)

删除字段并选择自动属性&让你的主人私下。

public string ConnectionString {get; private set;}

public string ProviderName {get; private set;}

罗布