我正在编写的一本书(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();
}
//...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:编译器如何"知道"属性"动物"和字段"动物"是否相关联,这样当在程序中,我实例化a 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;
}
}
Run Code Online (Sandbox Code Playgroud)
编写时myFarm.Animals.Add(...),运行时会为您的属性执行getter方法Animals.这个方法返回animals(因为你就是这样写的).Add()然后在结果上调用该方法.
我认为你的困惑可能是你觉得你正在"修改" Animals财产,因此你希望set参与其中.不是这种情况.该属性只是获取或引用类型对象的位置List<T>.您没有创建新列表或将参考点指向其他列表.参考保持不变.你只是在引用的对象上调用一个方法.这就是为什么它只是被称为属性的吸气剂.
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |