1. 程式人生 > 實用技巧 >C#中面向物件程式設計技術(屬性和方法)

C#中面向物件程式設計技術(屬性和方法)

1,屬性和方法

關於如何定義屬性,在定義屬性過程中需要用到get訪問器和set訪問器。
(1):屬性是對現實實體特徵的抽象,它提供了對類或物件性質的訪問。類的屬性描述的是狀態資訊,在類的例項中,屬性的值表示物件的狀態值。屬性不表示具體的儲存位置,屬性有訪問器,這些訪問器指定在他們的值讀取或寫入時需要執行的語句。所以屬性提供一種機制,把讀取和寫入物件的某些特徵與一些操作關聯起來,程式設計師可以像使用公共資料成員一眼使用它。屬性的宣告格式如下:
【修飾符】【型別】【屬性名】
{
get {get訪問器體}
set {set訪問器體}
}
引數說明:
修飾符:指定屬性的訪問級別
型別:指定屬性的型別,可以是任何的預定義或自定義型別


屬性名:一種識別符號,命名規則與欄位相同,但是,屬性名的第一個字母通常大寫
(2):get訪問器
get訪問器相當於一個具有屬性型別返回值的無引數方法,它除了作為賦值的目標外,當在表示式中引用屬性時,將呼叫屬性的get訪問器計算屬性的值。get訪問器必須用return語句來返回,並且所有的return語句都必須返回一個可隱式轉換為屬性型別的表示式。
(3):set訪問器
set訪問器相當於一個具有單個屬性型別值引數和void返回值型別的方法。set訪問器的隱式引數始終命名為value。當一個屬性作為賦值的目標被引用時就會呼叫set訪問器,所傳遞的引數將提供新值。不允許set訪問體中的return語句指定表示式。由於set訪問器存在隱式的引數value,所以set訪問器中不能自定義名稱為value的區域性變數或常量。

技巧:由於set訪問器中可以包含大量的語句,因此可以對賦值的屬性的值進行檢查,如果值不安全或者不符合要求,就給予提示,這樣可以避免因為給屬性設定了錯誤的值而導致錯誤。
例子:

 1  private string id = "";//定義一個string型別的變數,用來記錄使用者編號
 2         private string name = "";//定義一個string型別的變數,用來記錄使用者姓名
 3         /// <summary>
 4         /// 定義使用者編號屬性,該屬性為可讀可寫屬性
 5         /// </summary>
 6         public
string ID { 7 get { 8 return id; 9 } 10 set { 11 id = "value"; 12 } 13 } 14 /// <summary> 15 /// 定義使用者姓名屬性,該屬性為可讀可寫屬性 16 /// </summary> 17 public string Name { 18 get { 19 return name; 20 } 21 set { 22 name = "value"; 23 } 24 }

屬性和欄位都可以訪問物件中包含的資料。物件資料用來區分不同的物件,同一個類的不同物件可能在屬性和欄位中儲存了不同的值。欄位和屬性都可以輸入,通常數把資訊據儲存在欄位和屬性中,但是屬性和欄位是不同的,屬性不能個直接訪問資料,欄位可以直接訪問資料。在屬性中可以新增對資料訪問的限制,例如,有一個int型別的屬性,可以限制他只能儲存1~5個數字,但如果用欄位就可以儲存任何int型別的數值。

2,方法的定義

方法主要用來完成類或物件的行為,在面向物件程式語言中,類或物件是通過方法來與外界互動的。所以,方法是類與外界互動的的基本方式。方法包含一些列語句的程式碼,在C#中,每個執行指令都是在方法的上下文中完成的。
宣告方法時,需要為其指定修飾符,以指定其訪問級別或使用限制,C#中常用的有private、public、protected、internal4個訪問修飾符和partial、new、static、virtual、override、sealed、abstract、extern8個宣告修飾符下面對它們進行簡單介紹。

private 私有訪問是允許的最低訪問級別,私有成員只有在宣告它們的類和結構體中才能被訪問
public 公共訪問是允許的最高訪問級別,對訪問公共成員沒有限制
protected 受保護成員在它的類中可以訪問並且可由派生類訪問
internal 只在同一程式集的檔案中,內部型別或成員才可以訪問的

partial 在整個同一程式集中定義分部類和結構
new 從基類成員隱藏繼承的成員
static 宣告屬於型別本身而不是屬於特定物件的成員
virtual 在派生類中宣告其實現可由重寫成員更改的方法或訪問器
override 提供從基類繼承的虛擬成員的新實現
sealed 指定類不能被繼承
abstract 指示某個類只能是其他類的基類
extern 指示在外部實現方法

宣告方法時,除了需要指定上面所要介紹的修飾符外,還需要指定其返回值、方法名稱及方法引數等。方法引數放在括號中,並用逗號隔開,如果括號中沒有內容,則表示宣告方法沒有引數。另外,方法宣告的返回型別指定了由該方法計算和返回的值的型別,如果該方法並無返回值,則其返回型別為void。
C#中歐宣告方法的格式如下:
【修飾符】【返回型別】【方法名】(引數列表)
{
【方法體】
}

注意:一個方法的返回型別和其形參類表中所引用的各個型別必須至少具有與該方法本身相同的可訪問性。

例子:

 1 public double SquareName(double num) {
 2 
 3             return num * num;//求一個數的平方
 4         }
 5 
 6         private void button1_Click(object sender, EventArgs e)
 7         {
 8             string strNum = textBox1.Text.Trim();//記錄了textBox文字框中的內容
 9             if (strNum != null)
10             {
11                 try
12                 {
13                     textBox2.Text = SquareName
14                         (double.Parse(strNum)).ToString();//呼叫自定義方法進行求平方運算
15                 }
16                 catch 
17                 {
18 
19                     MessageBox.Show("請輸入正確的數字!");
20                 }
21             }
22         }

3,使用過載方法實現不同型別資料的計算
實際生活中經常遇到不同型別資料的計算問題。例如:計算某公司某月的總工資時,就有可能遇到這種情況。假設公司的工資是整數,如果沒有請假和遲到現象,那麼就是所有員工的工資相加,這時用到的都是整數型別的資料相加;而如果這個月中出現了請假或者遲到早退現象,那麼有的員工就可能是小數型別的,這時再計算總工資時,就有可能是整數和小數型別的資料相加。在C#中實現以上功能最快的方式就是使用過載方法,然後可以就設定過載方法中要計算資料的型別不同,這就可以實現不同型別資料的計算功能。

過載方法就是方法名稱相同,但是每個方法中引數的資料型別、個數或順序不同的方法。如果一個類中存在兩個以上的同名方法,並且方法的引數型別、個數或順序不同,當呼叫這樣的方法時,編譯器會根據傳入的引數進行判斷,決定呼叫哪個方法。
實際開發過程中對過載方法有這樣的一種解釋,過載方法就是名稱相同、簽名不同的方法。這裡所說的方法簽名,其實就是由方法的名稱和它的每一個形參的型別和種類(值、引用或輸出)組成的。這裡需要注意的是,雖然方法簽名包含ref和out引數,但是他並不區分這兩種引數。例如:一個方法的過載形式有兩種,一種是裡面只包含一個ref引數,另一種是裡面只有一個out引數,那麼這個方法在編譯時會出現異常,因為它違背了方法簽名的唯一原則。

例子:

 1 public static int Add(int x,int y)//定義一個靜態方法Add,返回值為int型別,有兩個int型別引數
 2         {
 3 
 4             return x + y;
 5         }
 6         public double Add(int x, double y)//重新定義方法Add,它與第一個方法的返回值型別及引數型別不同
 7         {
 8 
 9             return x + y;
10         }
11         public double Add(double x, double y)//重新定義方法Add,它與第一個方法的返回值型別及引數型別不同
12         {
13 
14             return x + y;
15         }

除了方法外,過載也可以出現在介面或者結構中
除了方法外,也可以對建構函式、索引器以及運算等進行過載