国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

閱讀《LEARNING HARD C#學習筆記》知識點總結與摘要三

2019-11-17 02:26:27
字體:
來源:轉載
供稿:網友

閱讀《LEARNING HARD C#學習筆記》知識點總結與摘要三

最近工作較忙,手上有幾個項目等著我獨立開發設計,所以平時工作日的時候沒有太多時間,下班累了就不想動,也就周末有點時間,今天我花了一個下午的時間來繼續總結與整理書中要點,在整理的過程中,發現了書中的一些不足,我在以下的博文中都有說明,大家如果有這本書的可以對照著知識點及書本相結合的方式來看,沒有這本本書的也可以對照著我整理的知識要點進行實際編碼測試與學習,希望能對大家有所幫助,如果覺得可以的話,還請推薦哦,謝謝!

閱讀《LEARNING HARD C#學習筆記》知識點總結與摘要系列文章從這篇博文開始,涉及的知識點的會越來越深入,希望大家能受益,若發現有不足之處,還請指出,謝謝!

首先補充之前的一個知識點:

委托只能定義在命名空間、類中,而不能定義在方法中(即:不能局部定義),這個在書中沒有說明,我是在寫代碼的時候認識到的,也請大家測試一下,看能否找出根本原因。

經我測試,發現不只委托類型,所有的自定義類型均不能在方法體中定義,均報錯,關于這個問題的思考與分析詳見我的博文:

C#簡單問題,不簡單的原理:不能局部定義自定義類型(不含匿名類型)

十三.泛型可變性

協變:指泛型類型參數可以從一個派生類隱式地轉換為基類,用out關鍵字標識類型參數,以標明其支持協變性。(即:可將子類型的類型參數泛型對象賦值給父類型的類型參數泛型對象),如:

List<object> objectList=new List<object>();

List<string> stringList=new List<string>();

objectList.AddRange(stringList);

逆變:指泛型類型參數可以從一個基類隱式的轉換為派生類,用in關鍵字標識類型參數,以標明其支持逆變性。(即:可將父類型的類型參數泛型對象賦值給子類型的類型參數泛型對象)。

逆變與協變剛好相反,可以理解協變是泛型類型參數的子類替換為父類的過程,逆變是泛型類型參數的父類替換子類的過程。

注意:

  1. 只有接口和委托才支持協變與逆變
  2. 協變與逆變只支持引用類型,因為可變性存在引用轉換,而值類型不具備
  3. 必需顯式的用in或out 關鍵字來標識類型參數,否則默認是不支持的
  4. 委托的可變性不要在多播委托中使用

十四.可空類型

  1. Nullable<值類型>,值類型? 均表示為可空類型,即允許為null值的值類型。
  2. 空合并操作符:雙問號(即:??),作用是若可空類型(這里的可空類型指的是可以為空的類型,包含引用類型)的值不為Null則返回其值否則返回指定的值,如:

Int? nullInt=null; nullInt= nullInt??0; nullInt的最終值是0;

  1. 可空類型若值為NULL,將其轉換為引用類型時,不會發生裝箱操作,因為引用類型本身就支持NULL值,而非NULL值則會發生裝箱操作。若將已裝箱的可空類型轉換為可空類型時,會發生拆箱操作,若值為NULL則拆箱后的可空類型值也為NULL;
  2. 使用可空類型的GetType方法,返回的是實際的值類型,若使用typeof方法,則返回的是可空類型;若可空類型的實際值為NULL,則調用上述兩種方法均會報錯。

十五.匿名方法

  1. 匿名方法的定義與普通方法定義基本相同,但匿名方法無方法名稱、返回類型,使用delegate關鍵字來定義方法,且在定義的同時必須將匿名方法賦值給相應的委托類型(即使用匿名方法來實例化委托),然后使用委托來執行,定義語法如下:

委托類型 anonymousMethod=delegate(形參列表)

{

//方法主體

};

  1. 匿名方法的生命周期與引用該匿名方法的委托對象生命周期相同;
  2. 被匿名方法引用的外部變量與匿名方法的生命周期相同;

十六.迭代器

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且不可更改,只能進行屬性成員賦值,不能定義除屬性外的其它成員(事件,索引器等),且屬性成員不能添加訪問修飾符默認為公共,屬性的類型就是其值的實際類型,屬性值的類型不限。

例子:

Func<string,string> sayFunc=delegate(string yourname){return yourname + ",您好。很高興認識你!";};

var Person = new { Name = "zuowenjun", Age = 29, Sex = "男", WebSite = "www.zuowenjun.cn", Say = sayFunc};

Console.WriteLine(Person.Say("博客園"));

輸出:博客園,,您好。很高興認識你!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大庆市| 黎平县| 伊宁市| 民和| 锦屏县| 伊川县| 洞头县| 三亚市| 丰宁| 永济市| 新郑市| 朝阳区| 鞍山市| 瓦房店市| 英山县| 五莲县| 将乐县| 高碑店市| 怀宁县| 苗栗县| 临桂县| 乌拉特中旗| 白玉县| 淮滨县| 新平| 抚州市| 洛南县| 彭水| 宽城| 三穗县| 衡南县| 东方市| 施甸县| 莱西市| 岳西县| 大厂| 徐水县| 昭通市| 贵南县| 额济纳旗| 和政县|