为了保护类的实例的各种数据信息,C#提供了两种方法:域和属性。其中,属性实现了良好的数据封装和数据隐藏。
1. 域
1.1. 声明
在C#中,域等价于变量,声明格式如下:attributes field-modifiers type variable-declarators;域的修饰符field-modifiers可以是:
l new
l public
l protected
l internal
l private
l static
l readonly
在下面的代码中,类A包含了三个域:公有的x、y,以及私有的z。
class A { public int x; public string y; private double z; } |
1.2. 静态域和非静态域
静态域的声明是使用static修饰符,其它的域都是非静态域。分别属于
C#中的静态变量和非静态变量。
1.3. 只读域
域的声明是如果加上了readonly修饰符,表明该域为只读域。对于只读域我们只能在域的定义中和它所属类的构造函数是进行修改,在其它情况下,域是只读的。如:
class A { public static readonly double PI=3.1415926; public static readonly int kByte = 1024; } |
只读域和const定义的常量的区别是,简单地说,const定义的常量在编译时形成,而只读域直到程序运行时才形成。
1.4. 域的初始化
在C#中,系统将为每个未经初始化的变量提供一个默认值。这虽然在某种程序上保证了程序的安全性,但对于应初始化为某个特殊值的变量忘记初始化,也常常会导致程序执行误入歧途。所有类型的变量的初始值如下表所示:
变量类型 | 默认值 |
引用类型 | null |
整型 | 0 |
char | /x0000 |
flat | 0.0f |
decimal | 0.0m |
bool | false |
enum | 0 |
2. 属性
属性是对现实世界中实体特征的抽象,它提供了对类或对象性质的访问。
C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问。它借助于get和set对属性的值进行读写。
2.1. 声明
属性采用如下方式进行声明:attributs property-modifiers type member-name{accessor-declarations},属性的修饰符property-modifiers有:
l new
l public
l protected
l internal
l private
l static
l virtual
l sealed
l override
l abstract
以上修饰符中,static、virtual、override、abstract修饰符不能同时使用
虽然属性和域的语法比较类似,但不能把属性当做变量那样使用,也不能把属性作为引用型参数或输出参数来进行传递。
2.2. 访问属性的值
在属性的访问声明中,对属性的值的读操作用get关键字标出,对属性的值的写操作用set关键字标出。如:
class File { private string s_filename; public string Filename { get { return s_filename; } set { if (s_filename != value) { s_filename = value; } } } } class Program { static void Main(string[] args) { File f = new File(); f.Filename = "myfile.text"; string s = f.Filename; Console.WriteLine("{0}",s); Console.ReadLine(); } } |
在属性的访问声明中:
l 只有set访问器,表明属性的值只能进行设置而不能读出
l 只有get访问器,表明属性的值是只读的,不能改写
l 同时具有set、get访问器,表明属性的值是可读可写的
3. 索引指示器
索引指示器使得可以像数组好样对对象使用下标。它为我们提供了通过索引方式方便地访问类的数据信息的方法。
4. 事件