2

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

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

4 回答 4

8

使用哪个实际上并不重要,除非在基类构造函数调用重写成员的非常奇怪的情况下,在这种情况下时间会改变:实例变量初始化程序在基类构造函数调用之前运行,而显然构造函数主体在之后执行。

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

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

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

您不能使用第一种形式执行此操作,因为自动实现的属性无法指定初始值。

(您可能还想考虑将设置器设为私有,但这是一个单独的问题。)

于 2012-06-27T08:18:34.523 回答
1

您本质上是在做同样的事情,但以不同的形式编写它。

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

于 2012-06-27T08:19:51.000 回答
1

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

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

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

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

于 2012-06-27T08:22:02.150 回答
0

删除字段并使用自动属性并将您的设置器设为私有。

public string ConnectionString {get; private set;}

public string ProviderName {get; private set;}

于 2012-06-27T08:20:06.007 回答