类在设计时,其字段成员一般被声明为私有的,如果想读取或设置其值,需要提供这样的方法,而在C#中,使用属性更充分体现了对象的封装性,让用户不直接操作类的相关数据,而是通过其提供的访问器进行访问。
属性可以是类、结构和接口的成员。其定义的形式为:
访问修饰符 数据类型 标识符
{
访问器声明;
}
访问修饰符可以是new,static,virtual,absctract,override和public,protected,private,internal的合法组合。
访问器有get访问器和set访问器两种,其声明的格式如下:
get
{
return 要访问的成员;
}
set
{
要设置值的成员 = value;
}
在使用get访问器时要注意,其使用return要返回的值必须与属性声明的数据类型相同,或能够隐式地转换为属性声明的数据类型。
set访问器的值是通过隐含的参数value带进来的,其主据类型也必须与属性声明的数据类型相同或能够进行隐式转换。
在属性定义中,get访问器和set访问器的规则如下:
(1)同时具有get访问器和set访问器的属性,其值是可以读取也可以进行修改的;
(2)只有get访问器的属性是只读属性,即这样的属性值仅允许读取,而不能进行修改;
(3)只有set访问器的属性为只写属性,即该属性的值仅能修改,而不能读取。
下面举一个例子,分别说明以上三种情况:
using System;
class Weather
{
private float t; //温度
private int w; //风级
private string sun; //天气情况
/// <summary>
/// 温度属性
/// </summary>
public float Temperature
{
get
{
return t;
}
set
{
if(value!=t)
t = value;
}
}
/// <summary>
/// 描述风的等级的属性
/// </summary>
public int Windy
{
set
{
w = value;
}
}
/// <summary>
/// 描述天气情况的属性
/// </summary>
public string Sun
{
get
{
return sun;
}
}
/// <summary>
/// 构造器
/// </summary>
public Weather()
{
this.sun = "天气晴朗";
}
/// <summary>
/// 带参数的构造器
/// </summary>
/// <param name="s">描述天气情况的字符串</param>
public Weather(string s)
{
this.sun = s;
}
/// <summary>
/// 输出天气信息的方法
/// </summary>
public void PrintInfo()
{
Console.WriteLine("今天:{0},风级:{1},气温:{2}",sun,w,t);
}
}
//定义主类进行测试
class Test
{
static void Main()
{
Weather wt = new Weather();
// wt.Sun = "天气晴朗";//此语句将引起错误1
wt.Temperature = 23.4f;
wt.Windy = 4;
Console.WriteLine("气温:{0}",wt.Temperature); //输出温度信息,即可修改亦可读取
// Console.WriteLine("风级:{0}",wt.Windy ); //虽然可以修改,但不可读取,否则引起错误2
Console.WriteLine("天气:{0}",wt.Sun); //虽然不能修改,但可以读
wt.PrintInfo(); //使用类提供的方法,可以输出(读取)全部的信息
}
}
错误1:无法对属性或索引器“Weather.Sun”赋值 -- 它是只读的
错误2:属性或索引器“Weather.Windy”无法用于此上下文中,因为它缺少 get 访问器
运行结果如下:
新闻热点
疑难解答