● 域(Field)又称成员变量(Member Variable),分为实例域和静态域。域的存取限制集中体现了面向对象编程的封装原则;
● 属性的背后是两个函数:赋值函数(get)和取值函数(set)。
域
域的初始化是面向对象编程中一个需要特别注意的问题。C#编译器缺省将每一个域初始化为它的默认值。简单地说,数值类型(枚举类型)的默认值为0或0.0,字符类型的默认值为‘x0000’,布尔类型的默认值为false,引用类型的默认值为null,结构类型的默认值为其内的所有类型都取其相应的默认值。虽然C#编译器为每个类型都设置了默认类型,但按照面向对象的设计原则,还是需要对变量进行正确的初始化,这也是C#推荐的做法,没有对域进行初始化会导致编译器发出警告信息。C#中对域进行初始化有两个地方:声明的同时进行初始化和在构造器内进行初始化。如前所述,域的声明初始化实际上被编译器作为赋值语句放在了构造器的内部的最开始处执行。实例变量初始化会被放在实例构造器内,静态变量初始化会被放在静态构造器内。如果声明了一个静态的变量并同时对之进行了初始化,那么编译器将构造出一个静态构造器来把这个初始化语句变成赋值语句放在里面。而作为const修饰的常量域,从严格意义上讲不能算做初始化语句,可以将它看做类似于C++中的宏代换。
属性
属性可以说是C#语言的一个创新,当然也可以说不是。不是的原因是它背后的实现实际上还是两个函数:赋值函数(get)和取值函数(set),这从它生成的中间语言代码可以清晰地看到。是的原因是它的的确确在语言层面实现了面向对象编程一直以来对“属性”这一OO风格的类的特殊接口的需求。C#不提倡将域的保护级别设为public,而使用户在类外任意操作——那样太不安全!对所有有必要在类外可见的域,C#推荐采用属性来表达。属性不表示存储位置,这是属性和域的根本性的区别。下面是一个典型的属性设计:
using System;
class MyClass {
int integer;
public int Integer {
get {return integer;}
set {integer=value;}
}
}
class Test {
public static void Main() {
MyClass MyObject=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer++;
Console.Write(MyObject.Integer);
}
}
正如期待的那样,程序输出“0 1”。可以看到属性通过对方法的包装给程序员提供了一个友好的域成员的存取界面。这里的value是C#的关键字,是进行属性操作时set函数的隐含参数,也就是在执行属性写操作时的右值。
属性提供了只读(get),只写(set),读写(get和 set)三种接口操作。对域的这三种操作,必须在同一个属性名下声明,而不可以将它们分离。
当然属性不止仅仅限于域的接口操作,属性的本质还是方法,可以根据程序逻辑在属性的提取或赋值时进行某些检查、警告等额外操作,看下面的例子:
class MyClass {
private string name;
public string Name {
get { return name; }
set {
if (value==null)
name=“Microsoft”;
else
name=value;
}
}
}
由于属性的方法本质,属性当然也有方法的种种修饰,属性也有5种存取修饰符,但属性的存取修饰往往为public,否则也就失去了属性作为类的公共接口的意义。除了方法的多参数带来的方法重载等特殊属性不具备外, virtual、 sealed、 override、 abstract等修饰符对属性有与方法同样的行为,但由于属性在本质上被实现为两个方法,它的某些行为需要注意。看下面的例子:
abstract class A {
int y;
public virtual int X {
get { return 0; }
}
public virtual int Y {
get { return y; }
set { y = value; }
}
public abstract int Z { get; set; }
}
class B: A {
int z;
public override int X {
get { return base.X + 1; }
}
public override int Y {
set { base.Y = value < 0? 0: value; }
}
public override int Z {
get { return z; }
set { z = value; }
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ninth/articles/90964.aspx