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