4.    C#中的属性
属性是对现实世界中实体特征的抽象,它提供了对类或对象性质的访问。比如,一个用户的姓名、一个文件的大小、一个窗口的标题,都可以作为属性。类的属性所描述的是状态的信息,在类的某个实例中属性的值表示该对象的状态值。

C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问。它借助于get和set对属性的值进行读写,这在C++中是需要程序员手工完成的一项工作。
4.1  C#属性的声明
C#的属性采用如下方式进行声明:

attributes proterty-modifiers type member-name {accessor-declarations}

属性的修饰符property-modifiers有:

●new

●public

●protected

●internal

●private

●static

●virtual

●sealed

●override

●abstract

以上修饰符中,static,virtual,override和abstract修饰符不能同时使用。

属性的访问声明accessor-declaration必须用一对“{”和“}”大括号括起来,在其中给出对属性的值进行读写的操作说明。

虽然属性和域的语法比较类似,但不能把属性当做变量那样使用,也不能把属性作为引用型参数或输出参数来进行传递。
4.2  访问属性的值
在属性的访问声明中,对属性的值的读操作用get关键字标出,对属性的值的写操作用set关键字标出。我们看下面的例子。


using System;
public class File
{
  private string s_filename;
     public string Filename{
     get{
         return s_filename;
     }
     set{
         if(s_filename!=value){
             s_filename=value;
             }
     }
  }
}
public class Test
{
  public static void Main(){
     File f=new File();
     f.Filename="myfile.txt";
     string s=f.Filename;
  }
}在属性的访问声明中:
●只有set访问器,表明属性的值只能进行设置而不能读出。
●只有get访问器,表明属性的值是只读的,不能改写。
●同时具有set访问器和get访问器,表明属性的值的读写都是允许的。

除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”,其它所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
举个例子,旅馆对住宿人员进行登记,要记录的信息有:客人改名、性别、所住的房间号、已住宿的天数。这里,客人的姓名和性别一经确定就不能理更改了,用户可以要求改变房间,住宿的天数当然也是不断变化的。我们在类的构造函数中对客人的姓名和性别进行初始化,在四个属性中,客人的姓名和性别是只读的,故只具有get访问器;房间号和住宿天数允许改变,同时具有set访问器和get访问器。


using System;
public class Customer
{
 public enum sex
 {
   man,
   woman,
   };
 public string s_name;
 public string Name{
    get{
        return s_name;
     }
 }
 private sex m_sex;
 public sex Sex{
     get{
         return m_sex;
     }
 }
 private string s_no;
 public string No{
     get{
         return s_no;
     }
     set{
         if(s_no!=value){
               s_no=value;
         }
     }
 }
 private int i_day;
 public int Day{
     get{
         return i_day;
     }
     set{
         if(i_day!=value){
            i_day=value;
            }
     }
 }
 public void Customer(string name,sex sex,string no,int day)
 {
  s_name=name;
  m_sex=sex;
  s_no=no;
  i_day=day;
  }
}
[url]http://www.jisuanjixuexiao.com[/url]