c#this關鍵字
1. 代表當前類的對象
class Father
{public int Age { get; set; }public string Name { get; set; }public Father(int age, string name){this.Age = age;this.Name = name;}public void Test(){Console.WriteLine($"name:{this.Name },age:{this.Age }");}}
調用:
Father father = new Father(100, "小明");
father.Test ();
father = new Father(50, "小李");
father.Test();
輸出:
name:小明,age:100
name:小李,age:50
2. 在同一個類中在一個構造函數中調用另一個構造函數
class Father
{public int Age { get; set; }public string Name { get; set; }public int Height { get; set; }public Father(int age, string name){this.Age = age;this.Name = name;}public void Test(){Console.WriteLine($"name:{this.Name },age:{this.Age }");}
}
如果要傳入三個參數,那么可以多加一個構造函數,如下:
class Father
{public int Age { get; set; }public string Name { get; set; }public int Height { get; set; }public Father(int age, string name){this.Age = age;this.Name = name;}public Father(int age, string name, int height){this.Age = age;this.Name = name;this.Height = height;}public void Test(){Console.WriteLine($"name:{this.Name },age:{this.Age }");}}
也可以使用this來簡化代碼,如下:
class Father
{public int Age { get; set; }public string Name { get; set; }public int Height { get; set; }public Father(int age, string name){this.Age = age;this.Name = name;}public Father(int age, string name, int height):this (age ,name){this.Height = height;}public void Test(){Console.WriteLine($"name:{this.Name },age:{this.Age }");}}
3. 為某個類添加擴展方法
class Father
{public int Age { get; set; }public string Name { get; set; }public int Height { get; set; }public Father(int age, string name){this.Age = age;this.Name = name;}public Father(int age, string name, int height) : this(age, name){this.Height = height;}public void Test(){Console.WriteLine($"name:{this.Name },age:{this.Age }");}}
static class FatherExtension
{public static void Eat(this Father father )//指定為Father類添加擴展方法,無參方法{Console.WriteLine("吃飯");}public static void Run(this Father father,bool isRun)//添加有參方法{Console.WriteLine($"{isRun }");}
}
調用:
Father father = new Father(100, "小明");
father.Eat();
father.Run(true );
什么時候需要使用擴展方法,個人認為有兩種情況,
- 某個類(非靜態類)的源代碼我們看不到,但是又想為這個類添加方法,這時候可以使用擴展方法,比如系統自帶的一些類
- 為接口添加一個方法,并且這個方法對于實現接口的這些類來說方法都是一樣的,如果在接口中添加這個方法的定義,那么我們就需要除了在接口中增加方法的定義以外,還需要在實現接口的每個類中寫一個一模一樣的方法
比如有個IPerson接口,里面有個MyAge的方法,然后我們現在想添加一個MyName的方法,并且MyName的內容一模一樣,如果不使用擴展方法的話,則如下:
添加MyName方法前:
interface IPerson{void MyAge();}class Chinese : IPerson{public void MyAge(){Console.WriteLine(10);}}class American : IPerson{public void MyAge(){Console.WriteLine(5);}}
可以看到在Chinese 類中、American 類中都添加了一個MyName的方法,如果接口的實現類有100個的話,那么我們還要添加100個一模一樣的方法,這樣無疑是重復的工作,如果通過通過擴展方法對接口進行擴展,則如下面的代碼所示:
interface IPerson{void MyAge();}class Chinese : IPerson{public void MyAge(){Console.WriteLine(10);}}class American : IPerson{public void MyAge(){Console.WriteLine(5);}}static class IpersonExtension{public static void MyName(this IPerson person ){Console.WriteLine("小明");}}
從上面的代碼可知,我們可以不更改接口和接口的實現類的代碼,然后另外添加一個靜態類,然后添加靜態方法對接口進行擴展,同樣實現了功能,但是減少了很多重復代碼。
4. 索引器中用于訪問集合元素
public enum NameOrder{First,Second}public class Name<T>{public Name(T firstName, T lastName){this.FirstName = firstName;this.LastName = LastName;}public T FirstName { get; set; }public T LastName { get; set; }public T this[NameOrder index]{get{switch (index){case NameOrder.First:return FirstName;case NameOrder.Second:return LastName;default:return default;}}}}
調用:
Name<string> name = new Name<string>("四", "李");
string firstName = name[NameOrder.First];
Console.WriteLine(firstName );