1_索引器
(1)索引器是C#中一個強大而實用的特性,允許像訪問數組一樣訪問類的成員
(2)索引器:一種可以讓我們使用索引來訪問對象的一種方法,是一組get,set訪問器,與屬性類似,但不同,索引器使用索引運算符[]而非點運算符.訪問
(3)格式:public 返回值類型,this[索引器數據類型 索引]
(4)獲取數據使用get訪問,獲取數據時set執行
class ClassRoom{public string No { get; set; }private List<Student> students= new List<Student>();public void MyAdd(Student s){students.Add(s);}public Student this[int index]{ get{ Console.WriteLine("index="+index);return students[index];} ?set{ ? ? ? ? ? ? ? ?Console.WriteLine("value=========" + value);students[index] = value;}}public Student this[string n]{get{/* for(int i = 0; i < students.Count; i++){if (students[i].Name == n){return students[i];} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}return null;*/return students.Find(s => s.Name == n);}}
?}
2_接口
(1)接口:沒有實現的合同,契約,規則,是定義一組成員,而不對成員進行實現的引用類型,只能被類和結構體所繼承,類和結構體實現接口的時候,必須實現接口中定義的所有成員
(2)接口是一種規范,不具備存儲數據和定義方法的能力,類和結構體繼承這個接口就要以這個接口為準,進行一一實現,具體怎么實現由類和結構體決定
(3)接口:規則,指定應該有什么;類和結構體:實現規則,具體應該有什么
(4)接口一般以I開頭:格式:interface 接口的名稱{成員}
(5)接口成員不能加訪問修飾符,方法不能有方法體
(6):的作用:類的繼承、接口的實現
(7)類的實現中,可以擁有更多的成員,但不能少
(8)當父類已經實現了接口,當子類再次繼承咸通的接口,子類可以不用實現接口成員,也可以重寫
(9)當基類和接口擁有相同的屬性名和方法的時候,派生類不需要自己實現,也可以使用new關鍵字重新實現
interface IPeople{string Name { get; set; }char Sex { get; set; }int Age { get; set; }}interface IStudnt{string StudentNo { get; set; }int Age { get; set; }
?}class People : IPeople, IStudnt{public string Name { get; set; }public string StudentNo { get; set; }public int Age { get; set; }public char Sex { get; set; }}//父類已經實現了接口,子類再次繼承相同接口可以不需要實現接口成員,也可以重寫,//當基類和接口中擁有同名的屬性和方法的時候,派生類不需要自己實現,也可以使用new關鍵字重新實現class Student : People, IStudnt{//重新實現public new int Age { get; set; }}
3_多接口
(1)當一個類實現了多個接口的時候,如果多個接口擁有相同的屬性,只需要實現一個即可
(2)如果多個接口擁有不同類型但數據名相同的屬性,需要顯示實現接口中的屬性;顯示實現接口,不需要也不能添加訪問修飾符,訪問這個成員的時候需要將對象標記為對應的接口類型
(3)因為方法可以重載,所以直接重載兩個接口中的方法即可
internal class Program{static void Main(string[] args){Test test = new Test();// test.CIA t1 = new Test();t1.C = 12;}}interface IA{string A { get; set; }string B { get; set; }int C { get; set; }void Fn(int v);}interface IB{string B { get; set; }string C { get; set; }string D { get; set; }void Fn(string v);}class Test : IA, IB{public string A { get; set; }//當一個類實現了多個接口的時候,如果多個接口擁有相同的屬性,只需要實現一個即可public string B { get; set; }//如果多個接口擁有不同類類型但是名稱相同的屬性,需要顯示實現接口中的屬性//顯式實現接口 不需要也不能添加訪問修飾符 這個成員的訪問,需要將對象標記為對應的接口類型int IA.C { get; set; }string IB.C { get; set; }public string D { get; set; }
?//因為方法可以重載,所有直接重載兩個接口中的方法即可public void Fn(int v){}public void Fn(string v){}
?}
4_接口的繼承
(1)一個類實現一個接口的時候,如果接口(B)繼承了另一個接口(A),這個類就必須實現A和B里面的所有成員
(2)接口與抽象類的異同
①:相同點:1、抽象類和接口都不能實例化 2、都可以包含未實現的方法,有派生類實現
②:不同點:
抽象類可以包含非抽象方法,接口不能包含抽象成員
一個類只能繼承一個抽象類,但可以實現多個接口
抽象類的派生類需要使用override覆寫類的成員,接口派生直接覆寫
抽象類包含訪問修飾符,接口不能有訪問修飾符
抽象類可以包含屬性,方法字段;接口可以包含屬性和方法
5_泛型
(1)泛型:不固定數據類型,廣泛的類型,泛型可以讓不同數據類型支持相同的業務邏輯
(2)默認情況下在定義方法時就需要指定類型,通過泛型可以把指定類型延遲到方法調用的時候
(3)泛型方法:在方法名后面添加<>,里面相當于類型的形參列表
(4)泛型的命名規范:以T開頭的單詞,盡量表達出這個類型的作用,如果使用一個單詞作為方法,建議使用T
(5)泛型方法在調用的時候指定數據類型,方法的返回值也可以用泛型;再調用方法的時候,泛型的指定可以省略,C#會自動根據實參推斷類型
Fn<int>(123);//明確23<T>的數據類型.
Fn<string>("aaaaa");
Fn<bool>(true);
//類型的指定是可以省略的,C#會自動根據實參推斷類型
Fn(123);
Fn("4444");
?
public static void Fn<T>(T i)
{Console.WriteLine(i);
}
//返回值也可使用泛型
public static T Fn1<T>(T i, T[] arr)
{return i;
}
public static Test1 Fn2<Test1,Test2>(Test1 i, Test2[] arr)
{return i;
}
public static int Fn3<Test1, Test2>(Test1 i, Test2[] arr)
{return 1;
} ?
6_泛型的使用
(1)泛型類:Cal3c<T> : ICalc<T>泛型接口中的泛型的類型,使用的是泛型類中定義的類型(即泛型是什么類型,接口就是什么類型)
(2)default 默認的,default(T)得到T的默認值
(3)泛型方法在調用的時候指定類型;泛型接口在實現的時候指定類型;泛型類實例化的時候指定類型
class Cal3c<T> : ICalc<T>{public T Add(T a, T b){//return a + b;//報錯,//T 未知類型,指所有的類型,并不是所有的數據類型都重載了+運算符,所以報錯
?//default 默認的 default(T)得到T的默認值return default(T);}public T Sub(T a, T b){throw new NotImplementedException();}}
7_泛型的約束
(1)聲明泛型方法,泛型接口,泛型類的時候,可以通過添加約束讓這個泛型不那么廣泛
(1)where T:struct 約束 T只能是值類型
public static void Fn2<T>(T v)where T:struct{}
(2)where T: calss 約束T只能是引用類型
public static void Fn3<T>(T v) where T : class{}
(3)where T :new() 約束泛型必須是一個類,并擁有無參構造方法
public static void Fn4<T>(T v) where T : new(){}
(4)where T : Peopele 約束泛型只能是這個類或者這個類的子類
public static void Fn5<T>(T v) where T : People{}
(5)where T : IPeople 約束泛型必須是實現了這個接口類或者這個類的子類
public static void Fn6<T>(T v) where T : IPeople