字段和属性是如何链接的

本文关键字:链接 何链接 属性 字段 | 更新日期: 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被调用。