C# 在 get 访问器中初始化对象
C# initialize object in get accessor
直到现在,我会创建一个名为 "Names" 的 属性 我们这样:
class Class1
{
private string[] names;
public string[] Names
{
get
{
return names;
}
set
{
names = value;
}
}
Class1()
{
names = new string[] { "Peter", "John" };
}
}
但最近我看到一些代码这样做:
class Class1
{
private string[] names;
public string[] Names
{
get
{
// Initialize object here
if (names == null)
names = new string[] { "Peter", "John" };
return names;
}
set
{
names = value;
}
}
Class1()
{
// No initialization here
}
}
所以这些人所做的就是只在需要的时候创建一个实例。对我来说似乎是很好的编程实践,可以节省内存和周期。也有助于保持构造函数的整洁。
我试图获取更多信息,但偶然发现了 Lazy Initialization,它似乎做了几乎相同的事情。我的问题是,这是好的编程习惯吗?是否有一些我没有看到的陷阱,或者我是否可以愉快地适应这种做法?
有一个问题是构造函数是同步的,而 getter 不是。所以在多线程的情况下,get 可以初始化多个实例。
直到现在,我会创建一个名为 "Names" 的 属性 我们这样:
class Class1
{
private string[] names;
public string[] Names
{
get
{
return names;
}
set
{
names = value;
}
}
Class1()
{
names = new string[] { "Peter", "John" };
}
}
但最近我看到一些代码这样做:
class Class1
{
private string[] names;
public string[] Names
{
get
{
// Initialize object here
if (names == null)
names = new string[] { "Peter", "John" };
return names;
}
set
{
names = value;
}
}
Class1()
{
// No initialization here
}
}
所以这些人所做的就是只在需要的时候创建一个实例。对我来说似乎是很好的编程实践,可以节省内存和周期。也有助于保持构造函数的整洁。 我试图获取更多信息,但偶然发现了 Lazy Initialization,它似乎做了几乎相同的事情。我的问题是,这是好的编程习惯吗?是否有一些我没有看到的陷阱,或者我是否可以愉快地适应这种做法?
有一个问题是构造函数是同步的,而 getter 不是。所以在多线程的情况下,get 可以初始化多个实例。