字段和属性如何链接?

SoL*_*lan 3 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();
    }
    //...
}
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访问者链接到字段.

Typ*_*eIA 7

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

public List<T> Animals
{
    get
    {
        return animals;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 很好,谢谢!为了确保我理解这一点:它有效,因为List <T>是一个引用类型,对吗?"get"提供了对动物的引用,因此Animals.Add()有点像对象的引用或指针.Add()? (2认同)