结束语在属性力量的所有访问在该领域要经过“吸气”和“二传手”的方法,结构或类领域。这允许为验证添加逻辑,延迟初始化等的可能性。此外,在类字段的情况下,它允许可能具有适用于某些实例但不适用于其他实例的逻辑;如果属性不是虚拟的,它可能难以有效地实现这样的逻辑(例如,一会可能要定义一个静态VerySpecialInstance
,并有属性getter说if (this == VerySpecialInstance) GetSpecialProperty(); else GetOrdinaryProperty();
),但它可以做。包装是否在价值无关的读写性能正交结构领域服务于一个目的
但是,如果结构的语义(例如System.Drawing.Point
)规定特定的读写属性可以写入任何对其类型合法的值,那么除了改变其值之外,写入将没有副作用,它将始终返回最后写入的值(如果有的话),如果没有写入,它将作为其类型的默认值读取;如果使用该类型的代码可能依赖于这些假设,我不清楚使用读写属性而不是字段来保存值可能带来的好处。
,微软使用属性,而不是字段之类的东西Point.X
等在历史上造成了混乱,因为MyList[3].X = 4;
将被转换为MyList[3].Set_X(4)
的事实,并没有看的Set_X
这是不可能的定义中来告诉方法是否会实现其在不改变所述结构的任何字段的情况下所需的效果;如今的C#编译器会猜测,这是行不通的,并且将禁止该构造,即使有一些struct
哪些类型的属性setter会在实际上工作就好了。如果X
是一个领域,而不是一个属性,如果微软曾表示,这两个安全的方式发生变异的结构体要么直接访问字段或传递结构作为ref
参数的不同诱变方法(如果它是哪种,结构类型的静态方法,可以访问公共字段),这样的猜测就没有必要了。
由于使用暴露结构领域,而不是读写性能提高了性能和语义清晰,存在什么原因使结构域私下和性能包呢?数据绑定需要属性,但我不认为它适用于结构类型(如果创建了一个结构副本,然后将原始属性设置为一个值并将副本的相应属性设置为另一个值,那么值应该是多少被报告给绑定的对象?)有没有我不知道的结构属性的一些好处?
我个人认为,在很多情况下,“理想”的结构,简直是暴露公共字段列表,并构造方法的参数仅仅是这些领域的初始值,为了。这样的结构将提供最佳性能和可预测的语义(除了字段的类型和名称外,其行为与所有其他此类结构的行为相同)。在没有任何事情可以做任何事情的情况下,除了简单地读写底层字段之外,是否有理由支持读写属性?
我理解类领域的“维护的一般准则”的概念,因为有很多方法人们可能希望将行为(如数据绑定)添加到类的字段特征中。字段可以以属性无法使用的方式使用这一事实可能会被视为包装类字段的论据。我的问题是,鉴于结构和类是不同的,是否有任何合理的理由将这样的指导方针扩展到结构域。 – supercat 2012-08-17 16:18:44
@supercat:正如我所说的,我个人在创建'struct'时使用了字段,所以我个人在'struct'中看不到使用属性的好处。 – Tigran 2012-08-17 16:21:16
感谢您的写作。我想知道其他人是否可以表达相反的观点。 – supercat 2012-08-17 20:32:50