類在設(shè)計時,其字段成員一般被聲明為私有的,如果想讀取或設(shè)置其值,需要提供這樣的方法,而在C#中,使用屬性更充分體現(xiàn)了對象的封裝性,讓用戶不直接操作類的相關(guān)數(shù)據(jù),而是通過其提供的訪問器進行訪問。
屬性可以是類、結(jié)構(gòu)和接口的成員。其定義的形式為:
訪問修飾符 數(shù)據(jù)類型 標識符
{
訪問器聲明;
}
訪問修飾符可以是new,static,virtual,absctract,override和public,protected,private,internal的合法組合。
訪問器有g(shù)et訪問器和set訪問器兩種,其聲明的格式如下:
get
{
return 要訪問的成員;
}
set
{
要設(shè)置值的成員 = value;
}
在使用get訪問器時要注意,其使用return要返回的值必須與屬性聲明的數(shù)據(jù)類型相同,或能夠隱式地轉(zhuǎn)換為屬性聲明的數(shù)據(jù)類型。
set訪問器的值是通過隱含的參數(shù)value帶進來的,其主據(jù)類型也必須與屬性聲明的數(shù)據(jù)類型相同或能夠進行隱式轉(zhuǎn)換。
在屬性定義中,get訪問器和set訪問器的規(guī)則如下:
(1)同時具有g(shù)et訪問器和set訪問器的屬性,其值是可以讀取也可以進行修改的;
(2)只有g(shù)et訪問器的屬性是只讀屬性,即這樣的屬性值僅允許讀取,而不能進行修改;
(3)只有set訪問器的屬性為只寫屬性,即該屬性的值僅能修改,而不能讀取。
下面舉一個例子,分別說明以上三種情況:
using System;
class Weather
{
private float t; //溫度
private int w; //風(fēng)級
private string sun; //天氣情況
/// <summary>
/// 溫度屬性
/// </summary>
public float Temperature
{
get
{
return t;
}
set
{
if(value!=t)
t = value;
}
}
/// <summary>
/// 描述風(fēng)的等級的屬性
/// </summary>
public int Windy
{
set
{
w = value;
}
}
/// <summary>
/// 描述天氣情況的屬性
/// </summary>
public string Sun
{
get
{
return sun;
}
}
/// <summary>
/// 構(gòu)造器
/// </summary>
public Weather()
{
this.sun = "天氣晴朗";
}
/// <summary>
/// 帶參數(shù)的構(gòu)造器
/// </summary>
/// <param name="s">描述天氣情況的字符串</param>
public Weather(string s)
{
this.sun = s;
}
/// <summary>
/// 輸出天氣信息的方法
/// </summary>
public void PrintInfo()
{
Console.WriteLine("今天:{0},風(fēng)級:{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("風(fēng)級:{0}",wt.Windy ); //雖然可以修改,但不可讀取,否則引起錯誤2
Console.WriteLine("天氣:{0}",wt.Sun); //雖然不能修改,但可以讀
wt.PrintInfo(); //使用類提供的方法,可以輸出(讀?。┤康男畔?/span>
}
}
錯誤1:無法對屬性或索引器“Weather.Sun”賦值 -- 它是只讀的
錯誤2:屬性或索引器“Weather.Windy”無法用于此上下文中,因為它缺少 get 訪問器
運行結(jié)果如下:

新聞熱點
疑難解答