一、屬性的概述
????????屬性是對實體特征的抽象,用于提供對類或對象的訪問,C# 中的屬性具有訪問器,這些訪問器指定在它們的值被讀取或寫入時需要執行的語句,因此屬性提供了一種機制,用于把讀取和寫入對象的某些特征與一些操作關聯起來。
????????屬性的聲明格式如下:
【訪問修飾符】 【類型】 【屬性名】
{get {get 訪問器體}set {set 訪問器體}
}
????????訪問修飾符:指定屬性的訪問級別;類型:指定屬性的類型,可以是任何預定義或自定義類型;屬性名:一種標識符,而且一般屬性名的第一個字母通常大寫;
????????get 訪問器:相當于一個具有屬性類型返回值的無參數方法,除了作為賦值的目標外,當在表達式中引用屬性時,它將調用該屬性的 get 訪問器獲取屬性的值,get 訪問器體需要用 return 語句來返回,并且所有的 return 語句都必須返回一個可隱式轉換為屬性類型的表達式;
????????set 訪問器:相當于一個具有單個屬性類型值參數和 void 返回類型的方法,set 訪問器的隱式參數始終命名為 value,當一個屬性作為賦值的目標被引用時,就會調用 set 訪問器,所傳遞的參數將提供新值,由于 set 訪問器存在隱式的 value 參數,因此在 set 訪問器中不能自定義名稱為 value 的局部變量或常量;
????????屬性可以分為以下幾種:
- 可讀可寫屬性:包含 get 訪問器和 set 訪問器
- 只寫屬性:只包含 set 訪問器
- 只讀屬性:只包含 get 訪問器
????????屬性的主要用途時限制外部類對類中成員的訪問權限,定義在類級別上,屬性不能作為 ref 參數或 out 參數傳遞。
????????屬性以兩種形式存在:一種時在公共語言運行庫的基類庫中定義的屬性,另一種時可以創建,并可以向代碼中添加附加信息的自定義屬性。
? ? ? ? 例如有:
public class Date
{private int Day = 7; //定義字段public int day //星期屬性,該屬性為可讀可寫{get { return Day; }set {if ((value > 0) && (value < 8)){Day = value;}}}}
????????C# 支持自動實現的屬性,即在屬性的 get 訪問器和 set 訪問器中沒有任何邏輯,而且必須同時擁有get 訪問器和 set 訪問器,例如有:
public int age
{get;set;
}
二、屬性的使用
????????程序中調用屬性的語法格式如下:
????????對象名.屬性名
????????需要注意的是:
- 如果要在其它類中調用自定義屬性,必須將自定義屬性的訪問級別設置為 public;
- 如果屬性為只讀屬性,不能在調用時為其賦值,否則產生異常。
????????get 訪問器是在取值的時候調用的,set 訪問器是在賦值的時候調用的,利用屬性可以保護字段以及為賦值或者取值添加判斷條件(if)。
三、方法
????????方法在類或結構中聲明,聲明時需要指定訪問級別、返回值、方法名稱及方法參數,方法參數放在括號中,并用逗號隔開,括號中沒有內容表示聲明的方法沒有參數。聲明方法的基本格式如下:
【訪問修飾符】返回值類型 方法名(參數表列)
{//方法的具體實現;
}
????????其中,訪問修飾符可以是 public、private、protected、internal 中的任何一個,也可以省略,如果省略訪問修飾符,則方法的默認訪問級別是 private,即只能在該類中訪問。
????????需要注意的是,一個方法的返回類型和它的形參列表中所引用的各個類型必須至少具有與該方法本身相同的可訪問性。
(一)方法的分類
????????方法分為靜態方法和非靜態方法,靜態方法需要有 static 修飾。
????????靜態成員與 C++ 類似,可參考 C++ 的對象和類中的靜態成員。但也有所區別,例如有:
namespace ClassName
{/** 靜態成員的聲明* 靜態函數的聲明以及對靜態成員和非靜態成員的調用*/public class Person{static int m_A = 10;int m_B = 20;public static void func(int a, int b){Person p = new Person();m_A = a;p.m_B = b;Console.WriteLine("a = " + a);Console.WriteLine("b = " + b);Console.ReadLine();}}}
(二)方法的重載
????????方法重載是指調用同一方法名,但各方法中參數的數據類型、個數或順序不同。
(三)Main 方法
????????Main 方法的默認訪問級別為 private。
(四)方法的參數
????????1、ref 參數(引用傳遞參數)
????????由于 C# 沒有對指針的操作,因此它在使用引用傳遞時,也沒有取址符號“&”,但提供了一個 ref 參數。ref 參數使形參按引用傳遞(即使形參是值類型),其效果是在方法中對形參所在的任何修改都將反映在實參中,如果要使用 ref 參數,則方法聲明和方法調用都必須顯式使用 ref 關鍵字。
????????使用 ref 參數時,需要注意以下幾點:
- ref 關鍵字只對跟在它后面的參數有效,而不是應用于整個參數列表;
- 在調用 ref 參數之前,一定要進行賦值。
- 實參只能是變量,不能是常量或者表達式;
- 在調用方法時,必須使用 ref 修飾實參,而且因為是引用參數,所以實參和形參的數據類型必須完全匹配;
????????2、out 參數(定義輸出函數,引用傳遞參數)
?????????out 關鍵字用來定義輸出函數,它會使參數通過引用來傳遞,不同的是 ref 關鍵要求變量必須在傳遞之前進行賦值,而使用 out 關鍵字定義的參數不用進行賦值即可使用,如果要使用 out 參數,則方法聲明和方法調用都必須顯式使用 out 關鍵字。
????????3、params 參數
params 參數可以修飾一個一維數組,用來指定在參數類型相同但數量過多或者不確定時所采用的方法參數。當使用 params 參數時,需要注意以下幾點:
- 只能在一維數組中使用 params 參數;
- 一個方法最多只能有一個 params 參數。
- 不允許使用 ref 關鍵字或者 out 關鍵字修飾 params 參數;
????????例如有:
public int AddNum(params int[] x)
{int res = 0;for (int i = 0; i < x.Length; i++){res += x[i];}return res;
}