最近工作較忙,手上有幾個項目等著我獨立開發設計,所以平時工作日的時候沒有太多時間,下班累了就不想動,也就周末有點時間,今天我花了一個下午的時間來繼續總結與整理書中要點,在整理的過程中,發現了書中的一些不足,我在以下的博文中都有說明,大家如果有這本書的可以對照著知識點及書本相結合的方式來看,沒有這本本書的也可以對照著我整理的知識要點進行實際編碼測試與學習,希望能對大家有所幫助,如果覺得可以的話,還請推薦哦,謝謝!
閱讀《LEARNING HARD C#學習筆記》知識點總結與摘要系列文章從這篇博文開始,涉及的知識點的會越來越深入,希望大家能受益,若發現有不足之處,還請指出,謝謝!
首先補充之前的一個知識點:
委托只能定義在命名空間、類中,而不能定義在方法中(即:不能局部定義),這個在書中沒有說明,我是在寫代碼的時候認識到的,也請大家測試一下,看能否找出根本原因。
十三.泛型可變性
協變:指泛型類型參數可以從一個派生類隱式地轉換為基類,用out關鍵字標識類型參數,以標明其支持協變性。(即:可將子類型的類型參數泛型對象賦值給父類型的類型參數泛型對象),如:
List<object> objectList=new List<object>();
List<string> stringList=new List<string>();
objectList.AddRange(stringList);
逆變:指泛型類型參數可以從一個基類隱式的轉換為派生類,用in關鍵字標識類型參數,以標明其支持逆變性。(即:可將父類型的類型參數泛型對象賦值給子類型的類型參數泛型對象)。
逆變與協變剛好相反,可以理解協變是泛型類型參數的子類替換為父類的過程,逆變是泛型類型參數的父類替換子類的過程。
注意:
十四.可空類型
Int? nullInt=null; nullInt= nullInt??0; nullInt的最終值是0;
十五.匿名方法
委托類型 anonymousMethod=delegate(形參列表)
{
//方法主體
};
十六.迭代器
1.foreach循環原理是,通過訪問迭代器(IEumerator),然後不斷的獲取下一個對象(MoveNext、Current),直到找不到下一個對象為止才停止循環。一個對象若需使用foreach循環,則該對象的類型必須實現IEumerable或IEumerable<T>接口,同時必須實現GetEnumerator方法來返回迭代器。
2. 實現GetEnumerator方法可能通過yield return 關鍵字來動態生成迭代器(迭代器的生成由編譯器來完成)
十七.C#3.0新特性
類的屬性簡化定義(自動實現屬性):訪問修飾符類型 屬性名{get;set;},無需聲明私有變量來存放屬性的值,編譯器在編譯的時候會自動生成。
隱式類型:采用var關鍵字來取代定義變量的類型(類似Javascript的var),變量的實際類型等於其值的類型,因為隱式類型需要依據變量的值來得出其真實類型,所以定義隱式類型的變量同時必須進行變量初始化,未初始化的或其初始化的值無法直接獲得實際類型的(比如:NULL)將會報錯。
注意隱式類型(var)僅能聲明在局部變量中,不能聲明為類的成員類型(字段、屬性、方法)以及方法的形參類型
隱式數組:實例化數組時無需指定數組的類型及個數,直接賦值數組各成員(利用的是集合初始化器),但需注意數組成員的類型必須統一,否則無法獲得真實類型,也就不滿足隱式類型的定義要求,會報錯的。定義語法如下:
Var intArray=new[]{1,2,3,4,5,6,7,8,9,10};
對象初始化器:在通過new調用類型的構造函數的同時(任意一個可實例的公共構造函數,未限定為無參的構造函數),直接賦值各類型的成員,定義語法如下:
類型 變量名=new 類型(參數){ 屬性=值,… …};
例子:Person p=new Person(){Name=”zuowenjun”,Age=29}; Person p=new Person(“zuowenjun”){ Age=29,Sex=”男”};
集合初始化器:在通過new調用類型的構造函數的同時(任意一個可實例的公共構造函數,未限定為無參的構造函數),直接賦值各類型的成員,但需要注意的是必需實現Add方法,編譯器是通過自動調用Add方法來實現集合的添加的。
定義語法如下:
類型 變量名=new 類型(參數){成員對象,… …};
例子:
List< Person> personList=new List< Person>(){new Person{Name=“張三”,Age=10}, new Person{Name=“李四”,Age=20}};
String[] strs=new[]{“a”,”b”,”c”,”d”};
Dictionary<int, string> dic = new Dictionary<int, string>(4) { { 1, "a" }, { 2, "b" }, { 3, "c" }, { 4, "d" } };
匿名類型:即無需定義類型,通過隱式類型和對象初始化器兩種特性來實例化一個未知類型的對象,定義語法如下:
Var 變量名=new{屬性名=值};
注意:匿名類型的訪問范圍默認為Internal且不可更改,只能進行屬性成員賦值,不能定義除屬性外的其它成員(事件,索引器等),且屬性成員不能添加訪問修飾符默認為公共,屬性的類型就是其值的實際類型,屬性值的類型不限。
例子: