只是好奇,我看到了两种在C#中创建集合的方法。对我而言,它只是一种风格,但也许还有另一种解释。性能?这是否符合模式?在示例2中我唯一能看到的是,它是一种防止覆盖集合的方法。
示例1:
public class Employee
{
...
public List<Phone> Phones
{
get; set;
}
...
}
因此。来自另一个班级
Employee employee = new Employee();
employee.Phones = this.GetPhones();
示例2:
public class Employee
{
...
private List<Phone> colPhones;
public List<Phone> Phones
{
get
{
if(this.Phones == null)
{
this.Phones = new List<Phone>();
}
return this.Phones;
}
}
...
public void AddPhone(Phone phone)
{
this.Phones.Add(phone);
}
}
所以
Employee employee = new Employee();
List<Phone> phones = this.GetPhones();
//--> Here, I know I can use for(int i....) instead of foreach. This is just for the example.
foreach(Phone phone in phones)
{
employee.Phones.Add(phone);
}
更新
当我读到一本名为&#34;重构&#34;的马丁福勒的书时,我找到了这个链接Encapsulate collection。这与接受的答案是相同的概念。
答案 0 :(得分:1)
执行以下代码时,私有成员变量将在代码的IL级别中创建。
public List<Phone> Phones { get; set; }
第二种方法是实现延迟加载的一种方法。通常,不提供this.Phones = new List<Phone>();
,而是提供一种从数据库生成集合的方法。使用第二种方案的另一个原因是不要覆盖任何现有的集合,但避免在引用属性时担心NullReferenceException
。
对于95%的情况,第一种情况没问题。
在这两个示例中,没有什么能阻止Employee类的使用者执行以下操作:employee.Phones.Add(new Phone())
。除非您创建属性readonly
,否则无法阻止修改集合,但是您只能在Employee
类的构造函数中设置它,然后您的AddPhone()
方法将会变得无法使用。
答案 1 :(得分:1)
在我看来,你的第一个例子是相当危险的。你自己说它很容易被覆盖&#34;该集合,但我认为更重要的是,如果你不是非常小心,它很容易对集合进行微妙的修改。
Employee employee = new Employee();
List<Phone> obscureTemporaryVariable = this.GetPhones();
employee.Phones = obscureTemporaryVariable;
...
// much later, after having forgotten all about the above bit of code
obscureTemporaryVariable.Clear();
obscureTemporaryVariable.Add(new Phone(42));
现在,您(大概是无意中)修改了&#34;员工&#34;的电话号码。