《Inside C#》笔记(六) 属性、数组、索引器
一 属性
a) 属性可用于隐藏类的内部成员,对外提供可控的存取接口。属性相当于有些语言的getter、setter方法,只是使用起来更加方便一点,而且查看对应的IL码可以看到,属性的本质也确实是方法。
b) 通过只提供get,可以让属性只读。只写属性也可以,但没有用过。
c) 属性除了用来控制对类成员的访问外,还可以在get或set的时候通过编码进行一些附加的动作。
d) 属性也可以被继承、重写。
二 数组
a) 在C#中,所有数组都继承自System.Array类。数组也是对象,所以声明的数组在使用前必须实例化。
b) 数组的Length属性指的是数组中所有的元素个数,这一点在多维数组中尤其要注意。如果想取得某一行的元素个数,可以使用.GetLength(<行数>)方法。通过Rank属性可以取得数组的维数。
c) 不规则数组(Jagged Array),不规则数组的元素是数组,每个数组的维数和长度可以不相同。声明方式如下:
C语言用类似这样的方式来声明多维数组,但C#声明多维数组的方式为:
要避免混淆。
三 索引器
a) 通过索引器可以像使用数组一样使用类成员。索引器与属性类似,都提供对类成员的某种操作方式。
b) 索引器的声明方式与属性略微有差别,主要在于索引器的名称只能是this,因为要把类名称当作数组来使用,所以不能有另外的名称
c) 索引器可以有重载,使用不同的参数组合来设置不同的索引方式。另外,据说索引器不能是静态的,本来想着将被索引内容也声明为静态就可以,但试了一下还确实不行,网络上有人的解释是:CLR支持静态索引器,但C#不支持。
d) 要注意索引器的使用场合(目前菜鸟的我还没遇到适合的场合),在恰当的地方使用可以带来方便,但对索引器的滥用却会带来各种问题,比如可读性的降低,invoice.Name显然是比invoice[2]直观的。