我正在完成的一本书(Wrox Beginning Visual C#2012,到目前为止是一本好书)在一个例子中使用了这个类:
class Farm<T> : IEnumerable<T> where T : Animal
{
private List<T> animals = new List<T>();
public List<T> Animals
{
get
{
return animals;
}
}
public IEnumerator<T> GetEnumerator()
{
return animals.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return animals.GetEnumerator();
}
//...
}
我的问题是:编译器如何知道&#34;该物业&#34;动物&#34;和田野&#34;动物&#34;链接,这样,当在程序中,我实例化Farm<Animal>
,然后说myFarm.Animals.Add(new Cow());
时,对象被添加到私人列表?我知道这是真的,因为我可以看到枚举器迭代animals
,因此当我说foreach (Animal animal in myFarm)
时,我看到animals
中我之前添加的对象Animals
。
当我们谈论像int这样的简单字段时,这对我来说更有意义。在这种情况下,很明显,当我设置MyInt=1
时会产生myInt==1
,这是因为该属性通过set
访问者链接到该字段。
答案 0 :(得分:7)
它并不“知道”它们是“联系在一起的”。它只是执行此代码:
public List<T> Animals
{
get
{
return animals;
}
}
当您编写myFarm.Animals.Add(...)
时,运行时会为您的Animals
属性执行 getter方法。此方法返回animals
(因为这就是你编写它的方式)。然后在结果上调用Add()
方法。
我认为您的困惑可能是您觉得自己正在“修改”Animals
属性,因此您希望参与set
。不是这种情况。该属性只是获取或引用类型为List<T>
的对象的位置。您没有创建新列表或将参考点指向其他列表。参考保持不变。你只是在引用的对象上调用一个方法。这就是为什么它只被称为属性的 getter 。