字段用来保持与对象相关联的数据。在大多数情节下,库中的任何非静态字段都应该是对于开发者不可见的。下列指导方针有助于你在库设计中正确地使用字段。
不要提供公共的或被保护的实例字段。
公共的字段和被保护的字段不是版本良好的并且不会通过代码访问的安全需要而被保护。而是可以用公共的可见字段来作为替代,并使用私有的字段并通过属性来暴露它们。
为始终没有变化的常量而使用常量字段。
例如,Math 类就把 E 和 PI 定义成了静态常量。
编译器会把常量字段的值直接插入到代码调用中,这就表示常量的值始终不会被改变,并且也不会引入兼容性问题的风险。
为预定义的对象实例而使用公共的静态只读字段。
例如,DateTime 类提供了能够用来获得 DateTime 对象并设置最大或最小时间值的静态只读字段。请参考:[MaxValue 属性]和[MinValue 属性]。
不要把易变的类型实例指派给只读字段。
使用可变的类型而被创建的对象能够在它们被创建之后被更改。例如,数组和大部分集合就是可变的类型,而 Int32、Uri,以及 String 就是不可变的类型。关于保持了一个可变的引用类型的字段,只读的修改器能够防止字段值被重写,但是不能保护可变的类型被更改。
下列代码范例示范了使用只读字段时的问题。BadDesign 类创建了一个只读的字段并使用一个只读的属性来暴露它。但是这仍然无法防止 ShowBadDesign 类对于只读字段所作的更改。
using System; namespace Examples.DesignGuidelines.Fields { public class BadDesign { public readonly int[] data = {1,2,3}; public int [] Data { get {return data;} } public void WriteData() { foreach (int i in data) { Console.Write ("{0} ", i); } Console.WriteLine(); } } public class ShowBadeDesign { public static void Main() { BadDesign bad = new BadDesign(); // 下列语句行将写入:1 2 3 bad.WriteData(); int[] badData = bad.Data; for (int i = 0; i< badData.Length; i++) { badData[i] = 0; } // 下列语句行将写入:0 0 0 // 因为坏数据已经被更改。 bad.WriteData(); } } }