字段和属性是如何链接的
本文关键字:链接 何链接 属性 字段 | 更新日期: 2023-09-27 17:50:21
我正在研究的一本书(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();
}
//...
}
我的问题是:编译器如何"知道"属性"动物"和字段"动物"是链接的,这样当,在程序中,我实例化一个Farm<Animal>
,然后说myFarm.Animals.Add(new Cow());
对象被添加到私有列表?我知道这是真的,因为我可以看到枚举器在animals
上迭代,因此因此当我说foreach (Animal animal in myFarm)
时,我看到的是animals
中我之前添加到Animals
中的对象。
当我们讨论像int这样的简单字段时,这对我来说更有意义。在这种情况下,似乎很明显,当我设置MyInt=1
并导致myInt==1
时,这是因为该属性通过set
访问器链接到字段。
它不知道它们是"链接"的。它只是执行以下代码:
public List<T> Animals
{
get
{
return animals;
}
}
当您编写myFarm.Animals.Add(...)
时,运行时执行getter方法用于您的Animals
属性。这个方法返回animals
(因为您就是这样写的)。然后在结果上调用Add()
方法。
我认为你的困惑可能是你觉得你正在"修改"Animals
属性,因此你期望set
参与其中。事实并非如此。属性只是一个获取或放置对List<T>
类型对象的引用的地方。您不是在创建一个新列表或将参考点指向另一个列表。引用保持不变。您只是在引用的对象上调用一个方法。这就是为什么只有属性的getter被调用。