-
裝箱:將值類型賦值給引用類型 拆箱:將引用類型強(qiáng)制轉(zhuǎn)換成值類型查看全部
-
事件 1、發(fā)布者和訂閱者 通知事件發(fā)生的,就是發(fā)布者; 對某個(gè)事件關(guān)注,就是訂閱者。 2、事件觸發(fā)和注冊 事件發(fā)生時(shí),會(huì)通知所有關(guān)注該事件的訂閱者。 想在事件發(fā)生時(shí)被通知,必須注冊以表示關(guān)注。 3、用程序語言解釋 事件發(fā)生時(shí),通知訂閱者,就是調(diào)用訂閱者的注冊函數(shù)。注冊,就是告訴發(fā)布者調(diào)用哪一個(gè)注冊函數(shù)。 4、事件聲明 delegate void Handler(); public event Handler NewDog;//Handler 是委托類型,NewDog為事件名 NewDog是一個(gè)成員,并且會(huì)被隱式自動(dòng)初始化為null 5、事件訂閱 NewDog + = 方法 //關(guān)注 NewDog - = 方法 //取消關(guān)注 方法可以是,實(shí)例方法,靜態(tài)方法,匿名方法、Lambda表達(dá)式 6、事件觸發(fā) if(NewDog!=null){ NewDog(); } 7、事件可以理解為一種封裝的受限制的委托,委托當(dāng)中包含著訂閱者的注冊函數(shù),事件觸發(fā)就是調(diào)閱委托當(dāng)中的回調(diào)函數(shù)。查看全部
-
多態(tài):虛函數(shù)virtual基類,override派生類重寫基類的字段或函數(shù) public class Pet(){ virtual public speak(); } public class Dog:Pet(){ public Dog(string name){ Name=name; } override public speak(Name+"wang"); } public class Dog:Pet(string name){ public Dog(string name){ Name=name; } override public speak(Name+"miao"); } main(){ Pet dog=new Dog(); //用基類引用,new派生類 Pet cat=new Cat(); dog.speak(); cat.speak(); } main(){ Pet[] pets=new Pet[]{new Dog("Jack"),new Cat("Tom") } for(int i=0;i<pets.length;i++){ pets[i],speak(); } }查看全部
-
Lambda表達(dá)式 1、什么是匿名方法 delegate void ActCute(); ActCute del; del=delegate(){//方法的具體內(nèi)容};//聲明一個(gè)匿名方法 2、Lambda表達(dá)式 del=delegate(){}; del=()=>{···};查看全部
-
委托、事件和lambda表達(dá)式 1、委托 就是持有一個(gè)或者多個(gè)方法的對象并且可以執(zhí)行該對象。 2、聲明委托 用delegate聲明 例如:聲明一個(gè)賣萌的方法 delegate void ActCute(); 3、定義委托類型的對象 既然委托是一種類型,就可以定義該類型的對象。例如ActCute actCute; 4、給委托對象賦值 例如; class Dog{ public void WagTai(){···} } actCute=dog.WagTail; 5、使用委托類型 想調(diào)用函數(shù)一樣使用委托類型。 actCute();查看全部
-
1、集合 就是一種存放多種數(shù)據(jù)的復(fù)雜類型。 2、基本集合類型 動(dòng)態(tài)數(shù)組 ArrayList 列表 :List 棧 Stack 字典 Dictionary 隊(duì)列 Queue 3、動(dòng)態(tài)數(shù)組ArrayList 初始化,可以不指定大小 獲取長度,使用Count屬性 添加是使用Add 刪除用Remove,RemoveAt 訪問[index] 4、List<T> ArrayList是類型不安全,而且有裝箱拆箱的性能問題,所以有了List<T>查看全部
-
1、字典Dictionary<TKey,Tvalue> 字典容器存儲(chǔ)的是一系列的鍵值對,沒個(gè)值對應(yīng)一個(gè)唯一的鍵。鍵的意義在于,我們可以通過鍵相對高效的訪問到值。 2、字典操作 數(shù)量 Count 添加 Add(key,value) 刪除 Remove 訪問 [key] 3、棧 出棧 Pop 入棧 Push 獲取棧頂元素 Peek 4、隊(duì)列 先進(jìn)先出容器。 出隊(duì) Dequeue 入隊(duì) Enqueue查看全部
-
封裝,多態(tài),繼承查看全部
-
泛型接口 1、泛型接口允許我們將接口成員的參數(shù)和返回類型設(shè)置為泛型參數(shù)的接口。 2、語法 interface Imyself<T>{//可以寫多個(gè)泛型參數(shù) T MySELF(T self); } 3、實(shí)現(xiàn)泛型接口語法 class A<T>:Imyself<A>{ public A Myself(A self);//類型參數(shù)可以是實(shí)現(xiàn)類本身或者其他類型 } 4、代碼示例 interface ILearn<A>{ void Act(A cmd);//學(xué)習(xí)技能的接口 } class Labrador:Dog,ILearn<Sit>{ public void Act(Sit cmd); }查看全部
-
約束 1、什么是約束 約束就是控制泛型這匹烈馬的韁繩!縮小泛型參數(shù)的范圍(無論多么泛泛,總有一個(gè)范圍,范圍越小越好控制) 2、約束的意義 只有添加了約束,才能調(diào)用泛型參數(shù)中(比如T)的方法。 對泛型類和方法都可添加約束。 3、約束的類型 類名 ——該類或者繼承該類的類 class ——任何類 struct ——任何值 接口名 ——該接口類型或任何實(shí)現(xiàn)該接口的類型 new() ——帶有無參共有構(gòu)造函數(shù)的類 4、約束疊加規(guī)則(這三個(gè)約束可以任意存在) A、主約束,只能有一個(gè)(類名,class,struct) B、接口約束,可以有任意多個(gè) C、構(gòu)造約束 5、約束例子 void Cage<T> where T:Pet,IClibTree,new() {···}查看全部
-
泛型方法 1、什么是泛型方法:就是方法的模型,給定具體的類型,就可以實(shí)例化出一個(gè)操作該類型的具體方法。 注意:泛型類中可以有泛型方法,普通類中也可以有泛型方法。 2、泛型方法語法 例如: class Dog{ void DogIsHappy<T>(T target){//普通類中的泛型方法 ··· } }查看全部
-
泛型 1、什么是泛型類 泛型類就是一個(gè)模子,轉(zhuǎn)入類型的材料,可以塑造出想要的產(chǎn)品。 2、語法 class Cage<T>//這是一個(gè)籠子類,這是一個(gè)泛型類,類名后加上一對<>,加上一個(gè)泛型參數(shù)(類類型參數(shù)), { T[] petArray; public void PutIn(T pet){···} public T TakeOut(int index){···}//T就是一個(gè)占位符 } //實(shí)例化 var dogCage=new Cage<Dog>();//得到狗狗籠子 var catCage=new Cage<Cat>();//得到貓咪籠子 3、為什么需要泛型 用基類或者公共的接口,甚至是所有類的基類object,也可以實(shí)現(xiàn)一個(gè)Cage類,但是類型態(tài)寬泛,需要顯示轉(zhuǎn)換類型,并且判斷真是類型是什么。 4、泛型使用 聲明一個(gè)泛型類->引用泛型->構(gòu)造實(shí)例 class Cage<t>{···} class Cage<Dog>{···} dogCage=new Cage<Dog>;查看全部
-
重載運(yùn)算符 1、什么是重載運(yùn)算符 利用現(xiàn)有的(不能創(chuàng)造新的運(yùn)算符)某種運(yùn)算符,針對自定義類(預(yù)定義類型和現(xiàn)有運(yùn)算符的運(yùn)算含義是確定的)或者結(jié)構(gòu),定義某種運(yùn)算符(比如公狗狗+母狗狗=新生狗狗)。 2、重載運(yùn)算符的原因 利用現(xiàn)有運(yùn)算符,簡化自定義類型的操作。做好是,該運(yùn)算符和該操作,具有一定相關(guān)性。 3、語法細(xì)節(jié) 例如公狗狗+母狗狗=新生狗狗 public static Dog operator +(Dog male,Dog female) { ··· } 4、那些運(yùn)算符可以重載 一元運(yùn)算符:+、-、!、~、++、- -、true、false(操作數(shù)必須是類和結(jié)構(gòu)) 二元運(yùn)算符:+、-、*、%、&、|!、^、<<、>>、= =、!=、>、<、>=、<=(兩個(gè)操作數(shù)至少有一個(gè)表示類或者結(jié)構(gòu)) 不能重載:=、&&、||、[](索引操作)、()等 5、重載運(yùn)算符不能做什么 創(chuàng)造新運(yùn)算符 改變運(yùn)算符語法 重定義運(yùn)算符如何處理預(yù)定義類型 改變運(yùn)算符的優(yōu)先級和結(jié)合性 6、重在運(yùn)算符舉例 ··· public void ShowAge() { Console.WriteLine("Age="+_age); } ··· //重載自增操作,針對寵物的年齡 public static Pet opertor ++(Pet pet)//返回值為Pet類型,參數(shù)為寵物自身。所有的重載方法都需要public static修飾 { ++pet._age; return pet; } ··· Dog dog=new Dog("Jack"); dog._age=2; dog++; dog.ShowAge();查看全部
-
自定義轉(zhuǎn)換 1、概念 為自己的類定義和結(jié)構(gòu)顯示和隱式轉(zhuǎn)換 2、為什么需要自定義轉(zhuǎn)換 使自己的結(jié)構(gòu)和類型可以變成一個(gè)預(yù)期相關(guān)的類型(比如我想將我家的狗狗轉(zhuǎn)化為貓咪),并且使這種轉(zhuǎn)化更加簡單。 3、隱式轉(zhuǎn)換語法 注意 public static implicit operator Dog(Cat cat)//implecit指定為隱式轉(zhuǎn)換,operator指定為轉(zhuǎn)換,參數(shù)為需要轉(zhuǎn)化的類型,operator后是目標(biāo)類型 { ··· } 4、顯示轉(zhuǎn)換 public static explicit operator Cat(Dog dog) 5、轉(zhuǎn)化實(shí)例 public static implicit operator Cat(Dog dog)//將狗狗轉(zhuǎn)化為貓咪 { return new Cat(dog.name); } //將貓咪轉(zhuǎn)化為狗狗 public static explicit opterator Dog(Cat cat)//顯示轉(zhuǎn)換 { return new Dog("Tom"); } ··· Dog dog=new Dog("Jack"); dog.Speak(); Cat cat=dog; cat.Spesk(); Dog dog2=(Dog)cat; dog2.Speak();查看全部
-
裝箱和拆箱 1、裝箱:根據(jù)值類型的值,在堆上創(chuàng)建一個(gè)完整的引用類型對象,并返回對象的引用,是一種隱式轉(zhuǎn)換(語言自動(dòng)完成)。 2、為什么要裝箱 有時(shí)候需要將值類型轉(zhuǎn)化為引用類型(比如object)來進(jìn)行統(tǒng)一的操作(比如作為函數(shù)的參數(shù))和統(tǒng)一的存儲(chǔ)(比如object[])。 3、裝箱簡單實(shí)例 int i=3; object oi=null; oi=i;//發(fā)生裝箱,原來的int保持不變,創(chuàng)建了一個(gè)新的對象,該對象在堆當(dāng)中。需要性能消耗的。 4、裝箱的本質(zhì) 就是在對上創(chuàng)建了一個(gè)引用類型的副本,新創(chuàng)建的引用類型和原來的值類型相互獨(dú)立。 相互獨(dú)立代碼驗(yàn)證: int i=3; object oi=i;//發(fā)生裝箱 Console.WriteLine("i="+i+",oi="+oi.ToString);//輸出為i=3,oi=3 oi=10; i=7; Console.WriteLine("i="+i+",oi="+oi.ToString);//輸出為i=7,oi=10 說明兩者相互獨(dú)立 5、拆箱 將裝箱后的對象轉(zhuǎn)化回值類型的過程,是一種顯示轉(zhuǎn)換(需要手動(dòng)干預(yù))。 6、拆箱實(shí)例 in i=3; object oi=i;//裝箱 int j=(int)oi;//拆箱查看全部
舉報(bào)
0/150
提交
取消