1. 程式人生 > 實用技巧 >C# this和base關鍵字的用法

C# this和base關鍵字的用法

this的用法
  • this關鍵字在類中使用,代表當前類的例項物件,但是它只能被用於例項建構函式、例項方法、屬性以及索引器中;
  1. 當局部變數名稱與類中欄位重名時,用來引用類的欄位;
  2. 可以當做當前物件例項作為引數傳遞到其他方法中;
  3. 宣告索引器;
  • 在一個類中有多個建構函式,我們可以把一部分公共程式碼提取出來作為一個建構函式,被其餘的建構函式作為建構函式初始化語句使用,可以用this串聯建構函式;
 1 class Car{
 2     private string name;
 3     public void DoSmothing(string name){
 4         this
.name=name;//類中欄位與區域性變數重名 5 CarTest.Test(this);//當做例項物件引數 6 } 7 public Car():this("Car"){} 8 public Car(string str):this(str,10){} 9 public Car(string str,int val){} 10 //宣告Car car=new Car();會先呼叫Car(string,int),在呼叫Car(string),最後是Car(); 11 } 12 class CarTest{ 13 public static
void Test(Car car){}; 14 }
  • 為原始型別擴充套件方法;
  1. 擴充套件方法是一種特殊的靜態方法,它必須定義在靜態類中
  2. 擴充套件方法的第一個引數以this修飾符為字首,後面跟要擴充套件的目標模板型別以及其形參;
  3. 擴充套件方法所在類必須在使用它的類的可見範圍,否則需要使用using指令引入名稱空間;
  4. 擴充套件方法只能針對例項,因此目標類不能是靜態類;
  5. 拓展方法與被擴充套件的類中某個方法簽名相同,則該拓展方法無效,永遠不會被呼叫;
  6. 同名情況下,其他名稱空間的擴充套件方法的優先順序低於當前名稱空間的擴充套件方法,優先順序最高的是例項方法;
 1 static class
Extends{ 2 //string型別擴充套件ToJson方法 3 public static object ToJson(this string Json){ 4 return Json == null ? null : JsonConvert.DeserializeObject(Json); 5 } 6 public static T ToObject<T>(this string Json){ 7 return Json == null ? default(T) : JsonConvert.DeserializeObject<T>(Json); 8 } 9 public static List<T> ToList<T>(this string Json){ 10 return Json == null ? null : JsonConvert.DeserializeObject<List<T>>(Json); 11 } 12 public static DataTable ToTable(this string Json){ 13 return Json == null ? null : JsonConvert.DeserializeObject<DataTable>(Json); 14 } 15 public static JObject ToJObject(this string Json){ 16 return Json == null ? JObject.Parse("{}") : JObject.Parse(Json.Replace("&nbsp", "")); 17 } 18 }
base的用法
  1. 在派生類呼叫基類方法和欄位等成員;
  2. 在派生類呼叫基類的構造方法;
 1 class BaseClass{
 2     public string FieldA="基類";
 3     public void MethodA(){};
 4     public BaseClass(){}
 5     public BaseClass(string str){}
 6 }
 7 class ChildClass:BaseClass{
 8     new public string FieldA="";//new 遮蔽基類成員
 9     public ChildClass():base(){}//ChildClass child=new ChildClass();先呼叫基類無參建構函式,在呼叫派生類無參建構函式
10     public ChildClass(string str):base(str){}//ChildClass child=new ChildClass("name");先呼叫基類有參建構函式,在呼叫派生類有參建構函式
11     //如果沒有base(str) 則是先呼叫預設的基類無參建構函式
12     public void Print(){
13         Console.WriteLine(base.FieldA);//呼叫基類欄位
14         base.MethodA();//呼叫基類方法
15     }
16 }