字段和属性如何链接?

时间:2014-03-15 16:49:58

标签: c#

我正在完成的一本书(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访问者链接到该字段。

1 个答案:

答案 0 :(得分:7)

它并不“知道”它们是“联系在一起的”。它只是执行此代码:

public List<T> Animals
{
    get
    {
        return animals;
    }
}

当您编写myFarm.Animals.Add(...)时,运行时会为您的Animals属性执行 getter方法。此方法返回animals(因为这就是你编写它的方式)。然后在结果上调用Add()方法。

我认为您的困惑可能是您觉得自己正在“修改”Animals属性,因此您希望参与set。不是这种情况。该属性只是获取或引用类型为List<T>的对象的位置。您没有创建新列表或将参考点指向其他列表。参考保持不变。你只是在引用的对象上调用一个方法。这就是为什么它只被称为属性的 getter