我正在阅读的一本书(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();
}
//...
}
我的问题是:编译器如何“知道”属性“Animals”和字段“animals”是相关联的,这样当我在程序中实例化一个 Farm<Animal>
时然后说myFarm.Animals.Add(new Cow());
对象被添加到私有(private)列表?我知道这是真的,因为我可以看到枚举器迭代了 animals
因此当我说 foreach (Animal animal in myFarm)
我在 animals
中看到了对象我之前添加到 Animals
.
当我们讨论像 int 这样的简单字段时,这对我来说更有意义。在那种情况下,当我设置 MyInt=1
时似乎很明显这导致 myInt==1
,这是因为该属性通过 set
链接到该字段访问器。
最佳答案
它“不知道”它们是“关联的”。它只是执行这段代码:
public List<T> Animals
{
get
{
return animals;
}
}
当你写 myFarm.Animals.Add(...)
,运行时为您的 Animals
执行 getter 方法属性(property)。此方法返回 animals
(因为你就是这样写的)。 Add()
然后在结果上调用方法。
我认为你的困惑可能是你觉得你正在“修改” Animals
属性,因此你期望一个 set
被涉及。不是这种情况。该属性只是一个获取或放置对 List<T>
类型对象的引用的地方。 .您不是在创建新列表或将引用点指向不同的列表。引用保持不变。您只是在所引用的对象上调用一个方法。这就是为什么只有属性的 getter 被调用的原因。
关于c# - 字段和属性如何关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22426747/