我刚刚编写了一小段代码,让我感到震惊的是,在初始化我将通过属性公开和使用的成员变量时,我不确定哪种初始化方法是最佳实践。从以下两个示例中初始化我的成员变量的最佳方法是哪种,更重要的是为什么?
示例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;
}
注意:假设我没有在静态上下文中使用这些变量。
答案 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;}
罗布