主頁 > .NET開發 > 《[深入淺出 C#] (第3版)》 - 學習筆記

《[深入淺出 C#] (第3版)》 - 學習筆記

2020-09-16 11:35:52 .NET開發

《深入淺出 C#》 (第3版)

========== ========== ==========
[作者] (美) Andrew Stellman (美) Jennifer Greene
[譯者] (中) 徐陽 丁小峰 等譯
[出版] 中國電力出版社
[版次] 2016年08月 第1版
[印次] 2018年04月 第4次 印刷
[定價] 148.00元
========== ========== ==========

【引子】

要學習編程,沒有別的辦法,只能通過撰寫大量代碼,

撰寫代碼是一種技巧,要想在這方面擅長,只能通過實踐,

【第01章】

(P007)

IDE 的優點在于,它能自動地為你生成一些代碼,但是它的作用僅此而已,

不過,對于編程中最困難的部分,也就是確定你的程式要做什么以及如何讓它能真正做到, IDE 就無能為力了,

IDE 為你做的所有一切,包括它創建的每一行代碼,增加的每一個檔案,都是可以修改的,你可以直接手動地編輯檔案,也可以通過 IDE 簡便易用的界面來修改,

【第02章】

(P054)

IDE 是一個功能強大的工具,不過僅此而已,這只是一個可供使用的工具,

(P056)

可以認為 IDE 是一種方便的檔案編輯器,它會自動為你完成縮進,改變關鍵字的顏色,完成括號匹配,甚至還能建議下一個可能的詞是什么,不過,歸根結底,IDE 所做的只是編輯檔案,這些檔案包含了你的程式,

(P057)

Windows Runtime 和 .NET Framework 中的工具劃分為不同的命名空間 (namespace) ,

Windows 8 中的每個程式都在一個稱為 Windows Runtime (Windows 運行時) 的體系結構上運行,不過在 Windows Runtime 與你的程式之間還有另外的一 “層” ,這稱為通用語言運行時庫 (Common Language Runtime , CLR) ,

(P060)

每個 C# 程式的代碼結構幾乎完全一樣,所有程式都使用了命名空間、類和方法,使代碼更易于管理,

每次建立一個新程式時,要為它定義一個命名空間,使程式代碼與 .NET Framework 類和 Windows Store API 類區別開,

類包含程式的一部分,

類中有一個或多個方法,方法總是放在類中,

方法由陳述句組成,

類檔案中方法的順序并不重要,

(P065)

只有使用了 partial 關鍵字時才能將一個類劃分到不同檔案中,

(P066)

C# 使用變數型別來限制變數能存盤哪些資料,

(P067)

要想確保不會忘記對變數賦值,最容易的方法是把宣告變數的陳述句與為變數賦值的陳述句結合起來,

(P076)

可以使用 && 運算子或 || 運算子把單個條件測驗結合為一個長測驗, && 表示與 (AND) , || 表示或 (OR) ,

(P093)

每個 C# 都必須有一個名為 Main 的方法,這個方法就是代碼的入口點,

運行代碼時, Main() 方法中的代碼最先執行,

【第03章】

(P108)

物件 (Object) 是 C# 的一個工具,可以用來處理一組類似的事物,

(P109)

類對于物件來說就像是設計藍圖,

一旦構建一個類,可以根據需要使用 new 陳述句創建多個物件,創建物件后,類中的各個方法都將成為物件的一部分,

(P111)

從一個類創建新物件時,這稱為創建這個類的一個實體,

(P115)

靜態方法不要求有實體,而非靜態方法需要先有一個實體,

(P116)

方法是物件做什么,欄位是物件知道什么,

物件的行為由方法定義,另外使用欄位來跟蹤它的狀態,

(P118)

程式創建一個新物件時,會把它增加到堆中,

(P122)

類圖是一種將類畫在紙上的簡單方法,這是一個很有意義的工具,利用類圖,可以在撰寫代碼之前設計代碼,

(P133)

物件初始化方法可以節省你的時間,使代碼更緊湊,更可讀 ······ 而且 IDE 會幫助你撰寫物件初始化方法,

【第04章】

(P141)

實際上,編程中所做的幾乎每一件事都是在以這樣或那樣的方式處理資料,

(P142)

sbyte 中的 “s” 代表 “有符號” (signed) ,表示它可以是一個負數 (“符號” 就是一個負號) ,

“u” 代表 “無符號” (unsigned) ,

(P143)

在 C# 代碼中轉義序列寫為兩個字符,不程序式會把各個轉義序列作為單個字符存盤在記憶體中,

(P144)

所有資料都會占據記憶體中的一定空間,

利用變數,可以在記憶體中預留足夠的空間來存盤資料,

(P147)

將一個數值賦至 float 時,需要在這個數字后面加一個 “F” ,告訴編譯器這是一個 float 而不是 double ,否則,代碼將不能編譯,

(P148)

使用 “+” 將一個字串與另一種型別的某個值或變數連接時,它會自動地將數字轉換為字串,

(P149)

形參 (parameter) 是方法中定義的引數,實參 (argument) 是向方法傳入的引數,

(P158)

要讓一個物件留在堆中,它必須被參考,物件的最后一個參考消失一段時間后,物件也會消失,

(P170)

物件使用 this 關鍵字時,就是指自己,這個參考指向呼叫 this 的物件,

(P171)

創建一個新參考但是還沒有為它設定任何物件時,它也會有一個值,剛開始時會設定為 null ,這說明它不指向任何物件,

如果一個物件有一個參考,而且以后不再使用這個物件,將它的參考設定為 null 時,就會立即將這個物件標志為可以回收 (除非別處還有這個物件的一個參考) ,

(P172)

要使用物件中的方法和欄位,唯一的途徑就是通過參考,

變數之所以稱為變數,就是因為它們總在改變,

在一個實體化物件的代碼中,實體可以使用這個特殊的 this 變數,其中包含它自己的一個參考,

【第05章】

(P211)

充分考慮到你的懶惰 —— 如果沒有加上 “private” 或 “public” 宣告, C# 就會認為這個欄位是私有的,

(P214)

一個物件要得到另一個物件私有欄位中存盤的資料,只有一個辦法 : 就是使用能回傳該資料的公共欄位和方法,

寫一個類時,一定要保證為其他物件提供了一個途徑來得到它們需要的資料,私有欄位是封裝的一個很重要的部分,但是它們并不是全部,要撰寫一個封裝性好的類,意味著要為其他物件提供一個合理的、易于使用的途徑來得到它們需要的資料,但不允許它們非法截獲你的類本身依賴的資料,

一個物件要得到另一個不同型別物件的私有欄位中存盤的資料,唯一的途徑就是使用回傳該資料的公共方法,

(P217)

封裝是指讓一個類對另一個類隱藏資訊,這有助于避免程式中的 bug ,

(P219)

如果你今天能很好地封裝類,明天重用這些類會容易得多,

(P221)

如果沒有合適的理由,就不要將欄位或方法宣告為公共,如果程式中的所有欄位都宣告為公共欄位,可能會把問題搞得一團糟,不過也不要把一切都設定為私有,先花一些時間來考慮這個問題,哪些欄位確實需要公共的,而哪些不必,以后這會為你節省很多時間,

(P226)

物件初始化方法中只能初始化公共欄位和屬性,

(P227)

要向類增加一個建構式,只需要增加一個與類同名的方法,而且沒有回傳值,

(P229)

方法中能做的,在屬性中也都可以做,

屬性 (獲取和設定存取方法) 是一種特殊型別的 C# 方法,只有當讀寫屬性時才會運行,

(P231)

如果在變數前增加 this 關鍵字,就是在告訴編譯器你所指的是欄位,而不是引數,

(P234)

封裝可以使你的類以后更易于理解和重用,

【第06章】

(P241)

對于只有一行代碼的代碼塊,大括號是可選的,

(P260)

使用 override 關鍵字向子類增加一個方法,可以替換它繼承的方法,覆寫一個方法之前,需要在基類中將這個方法標志為 virtual ,

(P265)

任何方法需要一個類作為引數時,完全可以輸入擴展這個類的一個子類的實體,

(P268)

如果子類只是增加一個與超類方法同名的方法,那么它只是隱藏了超類方法而不是覆寫這個方法,

(P271)

如果你想覆寫一個基類中的方法,一定要用 virtual 關鍵字標志這個方法,如果希望在子類中覆寫這個方法,就要使用 override 關鍵字,如果沒有做到這一點,很可能會無意中隱藏方法,

(P272)

即使子類覆寫了基類中的方法或屬性,有時仍可能希望訪問基類中的這個成員,幸運的是,可以使用 base 關鍵字,利用這個關鍵字就可以訪問基類中的任何方法,

【第07章】

(P296)

使用介面要求一個類包含介面中所列的全部方法和屬性,如果類沒有做到這一點,編譯器會報錯,

只要編譯代碼時類中有介面要求的方法和屬性,介面并不關心這些方法或屬性是如何得來的,

(P297)

介面不存盤資料,所以不能增加任何欄位,

公共介面中的所有方法都會自動成為公共方法,因為介面就是用來定義實作該介面的類的公共方法和屬性,

(P298)

介面的目的是讓一個類可以完成多個任務,而不依賴于繼承,因為繼承會帶來很多額外的負擔,你必須繼承每一個方法、屬性和欄位,而不只是與處理特定任務有關的那些成員,

(P300)

在介面中不需要輸入 “public” 因為會自動將介面中的各個屬性和方法置為公共,

(P303)

跟蹤物件時,介面參考與物件參考同樣有效,

可能并不需要一個物件參考,完全可以創建一個新物件,并把它直接賦給一個介面參考變數,

(P304)

利用 “is” 可以比較介面,也可以比較其他型別,

(P305)

由于所有介面中都沒有具體的方法體,所以不需要考慮呼叫基類建構式或方法,繼承介面 (子介面) 只需匯集它繼承的介面的所有方法和屬性,

(P306)

任何類可以實作任何介面,只要它能信守承諾,實作該介面的所有方法和屬性,

(P307)

“is” 指出一個物件實作了什么, “as” 則告訴編譯器如何看待一個物件,

(P309)

向上強制轉換唯一的缺點是,只能使用基類的屬性和方法,

一旦將一個子類向上強制轉換為基類,由于訪問物件使用的是基類參考,所以只能訪問這個基類的方法和屬性,

(P310)

向下強制轉換的第一步是使用 “is” 關鍵字檢查有沒有這種可能,

(P312)

如果向下強制轉換是非法的, as 陳述句只會回傳 null ,

介面中不允許有任何陳述句,

介面就像一個清單,編譯器檢查這個清單來確保類實作了指定的方法,

(P315)

我們把一個類的方法、欄位和屬性稱為它的成員 (members) ,所有成員都可以標志 public 或 private 訪問修飾符,

將一個類成員標志為 private 時,只有這個類中的成員或該類的其他實體能訪問這個成員,

不能把一個類標志為 private ,除非這個類位于另一個類內部,在這種情況下,它只對它的 “容器” 類的實體可用,

類成員默認為私有,如果希望它是公共的,需要明確標識為公共,

宣告一個類成員時如果沒有訪問修飾符,就默認為 private ,

protected 對于子類表示 public ,對其他表示 private ,

子類不能訪問其基類中的私有欄位,另外必須使用 base 關鍵字才能訪問基類物件的公共成員,

標志 protected 的類成員可以由該類中所有其他成員訪問,另外該類子類中的所有成員也可以訪問,

宣告一個類或介面時,如果沒有訪問修飾符,默認設定為 internal ,

如果你沒有使用多個程式集, internal 對于類和介面來說就相當于 public ,

(P318)

利用屬性,可以讓一個東西在其他物件看來像是一個欄位,但由于它實際上是一個方法,這樣就不會真正存盤任何資料,

介面參考只知道這個介面中定義的方法和屬性,

(P320)

抽象類可以有欄位和方法,而且也可以繼承其他類,這與正常類是一樣的,

抽象類可以包含屬性和方法的宣告,與介面一樣,子類必須實作這些屬性和方法,

抽象類和具體類之間最大的區別在于,不能使用 new 創建抽象類的實體,

如果一個方法有宣告但是沒有陳述句或方法體,這稱為一個抽象方法 (abstract method) ,就像繼承介面一樣,繼承抽象類的子類必須實作所有抽象方法,

只有抽象類可以有抽象方法,如果把一個抽象方法放在一個類中,就必須標志這個類為抽象類,否則無法編譯,

(P322)

將一個類標志為 abstract 時, C# 不允許你撰寫代碼來實體化這個類,這很像介面,它就相當于一個模板,繼承它的子類都要以它為模板,

為類宣告增加 abstract 關鍵字,這就告訴 C# 這是一個抽象類,不能實體化,

(P323)

介面中的各個方法自動作為抽象方法,所以在介面中不需要像抽象類中那樣使用 abstract 關鍵字,

抽象類可以有抽象方法,不過也可以有具體方法,

(P330)

封裝是指創建一個物件,使用私有欄位在內部記錄它的狀態,另外通過公共屬性和方法使其他類只能使用它們需要看到的那部分內部資料,

(P331)

將一個類的實體用在需要其他型別 (如父類或這個類實作的介面) 的陳述句或方法中,這就是在使用多型,

【第08章】

(P353)

enum 資料型別只允許某個資料取某些特定的值,

大括號里的內容稱為列舉項串列 (enumerator list) ,其中每一項稱為列舉項 (enumerator) ,整體稱為列舉 (enumeration) ,

(P354)

可以把一個 int 強制轉換為一個 enum ,還可以把一個 (基于 int 的) enum 強制轉換回 int ,

(P358)

用陣列來存盤一個固定的值或參考串列還不錯,但是如果需要移動陣列元素,或者要增加超出陣列容量的更多元素,就有些麻煩了,

(P363)

List 有一大特點 : 創建 List 時你不需要知道它會有多長, List 會自動伸縮來適應它的內容,

foreach 回圈也能處理陣列,實際上, foreach 回圈適用于任何集合,

(P367)

“泛型” (generic) 是指,盡管 List 的一個特定實體只能存盤一種特定型別,但 List 類適用于任何型別,

創建一個新的 List 物件時,總要提供一個型別,告訴 C# 它會存盤什么型別的資料,

(P368)

集合初始化方法可以使代碼更緊湊,可以把創建串列和增加一組初始項結合在一起,

(P371)

要讓 List 的內置 Sort() 方法對某個類排序,只需讓這個類實作 IComparable<T> 介面,并增加一個 CompareTo() 方法,

List.Sort() 方法知道如何對實作了 IComparable<T> 介面的類或型別排序,這個介面只有一個成員,即 CompareTo() 方法, Sort() 使用一個物件的 CompareTo() 方法與其他物件比較,并使用其回傳值 (一個 int) 來確定哪一個在前,

但是有時需要對沒有實作 IComparable 介面的物件串列排序,對此, .NET 中的另一個介面可以提供幫助,可以向 Sort() 傳入一個實作了 IComparer<T> 的類的實體,這個介面也只有一個方法,List 的 Sort() 方法使用這個比較物件的 Compare() 方法來比較一對物件,從而得出它們在有序串列中的先后順序,

(P373)

要使用 IComparer<T> 排序時,需要創建實作這個介面的類的一個新實體,這個物件的存在是為了幫助 List.Sort() 確定如何對陣列排序,

(P377)

每個 .NET 物件都有一個名為 ToString() 的方法,這個方法可以把物件轉換為一個字串,默認地,它只是回傳類名,

聯接字串的 “+” 運算子會自動呼叫一個物件的 ToString() ,

Console.WriteLine() 或 String.Format() 也會在傳入物件時自動呼叫這個方法,如果你想把一個物件轉換為一個字串,這會很方便,

(P379)

集合初始化方法適用于任何 IEnumerable<T> 物件,只要它有一個 Add() 方法,

集合實作 IEnumerable<T> 時,就為你提供了一種方法,可以撰寫回圈按順序回圈處理其中的內容,

(P380)

如果你想把一個物件集合增加到一個更通用的串列中,協變就非常有用,

List.AddRange() 方法,這個方法可以把一個串列的內容增加到另一個串列中,

(P401)

佇列是先入先出型 (first-in first-out) ,這說明入佇列的第一個物件也就是最先取出使用的物件,

堆疊是先進后出型 (first-in last-out) ,最先進入堆疊的物件將最后一個取出,

可以使用 foreach 回圈處理堆疊或佇列,因為它們都實作了 IEnumerable ,

【第09章】

(P410)

流 (stream) 是 .NET Framework 為程式提供的讀寫資料的方法,

如果希望對檔案讀寫資料,就會使用一個 Stream 物件,

(P411)

流允許讀寫資料,要針對所處理的資料使用適當型別的流,

(P412)

FileStream 一次只能關聯一個檔案,

流向檔案寫位元組,所以需要將要寫的 string 轉換為一個 byte 陣列,

關閉檔案,使其他程式能夠訪問這個檔案,

如果忘記關閉流,這是一個嚴重的問題,如果沒有關閉流,檔案會被鎖定,其他程式在你關閉這個流之前將無法使用這個檔案,

(P413)

StreamWriter 會為你自動創建和管理一個 FileStream 物件,

可以向 StreamWriter() 建構式傳入一個檔案名,如果傳入了檔案名,書寫器 (writer) 會自動打開這個檔案, StreamWriter 還有一個多載建構式,允許你指定它的追加模式 : 傳入 true 表示要把資料增加 (或追加) 到一個現有檔案的末尾,傳入 false 會告訴流要洗掉現有檔案,再創建一個同名的新檔案,

如果保持流打開并關聯到一個檔案,就會鎖定這個檔案一直處于打開狀態,其他程式將無法使用這個檔案,所以一定要關閉檔案,

(P417)

StreamReader (繼承自 TextReader) 是一個從流讀取字符的類,它本身不是一個流,將一個檔案名傳入這個類的建構式時,它會為你創建一個流,呼叫它的 Close() 方法時它會關閉這個流,

StreamReader 還有一個多載的建構式,有一個 Stream 引數,

EndOfStream 屬性指出檔案中是否還有未讀的資料,

(P418)

可以把流串起來,一個流可以寫到另一個流,而這個流又可以再寫到下一個流······ 最后通常是網路或者一個檔案流,

(P424)

File 類完成少量操作時速度更快,而 FileInfo 更適合完成大量任務,

(P425)

StreamReader 和 StreamWriter 會為你將位元組轉換為字符,這稱為編碼和解碼,

如果只是按部就班地向一個文本檔案讀寫文本行,那么只需要 StreamReader 和 StreamWriter 就足夠了,

(P429)

在一個 using 塊中宣告一個物件,這個物件的 Dispose() 方法會自動呼叫,

對于任何實作了 IDisposable 介面的類,只要呼叫了它的 Dispose() 方法,會給立即釋放它占用的資源,通常這是結束物件處理的最后一步,

(P430)

每個流都有一個 Dispose() 方法,它會關閉這個流,所以如果在一個 using 陳述句中宣告流,它總會自行關閉,

所有流都實作了 IDisposable ,所以只要使用流,都應當在一個 using 陳述句中宣告,這樣能確保流總是會關閉,

可以在 using 陳述句上再羅列其他 using 陳述句,不需要另外的大括號或縮進,

(P437)

switch 陳述句將一個變數與多個可能值進行比較,

每個 case 都必須以 “break;” 結束,這樣 C# 才能知道一種情況在哪里結束,下一個在從哪里開始,

還可以用 “return” 結束一個 case ,只要一個 case 不會繼續 “落入” 下一個 case ,程式就能編譯,

switch 陳述句的體是一系列 case 陳述句,將 switch 關鍵字后面的變數與一個特定值比較,

每個 case 都包括一個 case 關鍵字,后面時要比較的值和一個冒號,然后是一系列陳述句,最后是 “break;” ,如果這個 case 中的值與比較值匹配,就會執行這些陳述句,

(P444)

將物件復制到檔案或者從檔案讀出一個物件很簡捷,可以完成串行化和逆串行化,

(P451)

使用 File.Create() 時,這會創建一個新檔案,如果已經有這樣一個檔案,這個方法會把原檔案洗掉而創建一個全新的檔案,另外還有一個 File.OpenWrite() 方法,它會打開原來的檔案,并從頭開始覆寫,

【第10章】

(P498)

定義頁面控制元件的 XAML 會成為一個 Page 對象,它的欄位和屬性包含這些 UI 控制元件的運用,

(P512)

XAML 中的資料系結是指源屬性與目標屬性之間的一種關系,源屬性是為控制元件提供資料的物件 (資料物件) 的一個屬性,目標屬性是顯示該資料的控制元件 (控制元件物件) 的一個屬性,要建立資料系結,控制元件的資料背景關系必須設定為這個資料物件的一個參考,必須將控制元件的系結 (binding) 設定為一個系結路徑,就是要系結到物件的這個屬性,一旦完成這些設定,控制元件就會自動讀取源屬性,并作為控制元件的內容顯示這個資料,

(P513)

.NET 提供了 ObservableCollection<T> ,這是一個專門為資料系結建立的集合類,

創建 XAML 代碼實作資料系結時,它會使用一個 Binding 物件的實體來建立系結,這個物件把目標屬性的名字存盤為一個字串,

(P525)

頁面中的靜態資源會在頁面首次加載時實體化,應用中的物件可以在任何時候使用這些靜態資源,

(P526)

可以讓資料物件通知它們的目標屬性和系結控制元件,告訴它們資料已經改變,你要做的就是實作 INotifyPropertyChanged 介面,這個介面中包含一個名為 PropertyChanged 的事件,只要一個屬性有變化,就會觸發這個事件,可以看到系結控制元件會自動自行更新,

(P527)

要通知一個系結控制元件某個屬性有變化,你要做的就是呼叫 OnPropertyChanged() ,并提供發生變化的那個屬性的名字,

【第11章】

(P544)

可以使用一個新技術重新構建你之前已經構建的一個程式,這是掌握這種新技術的一個非常好的方法,

方法中有一個 await 時,在這個方法的宣告中必須有一個 async ,

(P546)

使用二進制串行化時,你寫的是 “純” 資料 : 會把記憶體中的實際位元組連起來,寫到一個檔案中,另外會為二進制格式化工具提供足夠的資訊,使它能確定哪些位元組對應物件圖中的哪些類成員,

(P547)

資料契約 (data contract) 是與類關聯的一個正式約定,這個契約使用 [DataContract] 和 [DataMember] 屬性來定義串行化時要讀寫什么資料,

如果你想串行化一個類的實體,可以為它建立一個資料契約,在最上面增加 [DataContract] 屬性,然后為要串行化的各個類成員增加 [DataMember] 屬性,

(P557)

要讓一個 async 方法呼叫另一個異步方法,被呼叫的方法的回傳型別必須是 Task 類 (或者,如果這個方法需要回傳一個值,回傳型別也可以是它的子類 Task<T>) ,

推薦的命名約定是在使用 await 運算子呼叫的異步方法名末尾增加 Async ,

async 修飾符、 await 關鍵字以及 Task 類都是為了更容易地撰寫異步代碼,

【第12章】

(P585)

把可能拋出例外的代碼放在 try 塊中,如果沒有發生例外,它會正常地運行, catch 塊中的陳述句將被忽略,不過,如果 try 塊中的某個陳述句確實拋出了一個例外, try 塊中的其余陳述句就不會再執行,

(P587)

Watch 視窗中完成的所有修改只會影響記憶體中的資料,而且只持續到程式運行結束,重啟程式時,在 Watch 視窗中修改的值又會還原,

(P588)

把斷點加在 try 塊的開始大括號上,

(P595)

在 catch 塊中指定一個例外型別時,如果提供了一個變數名,代碼就可以使用這個變數名來訪問這個 Exception 物件,

(P601)

要記住,在 “using” 陳述句中宣告一個參考時,會在這個塊末尾自動呼叫它的 Dispose() 方法,

使用 using 陳述句時,就是在充分利用 finally 來確保總會呼叫它的 Dispose() 方法,

(P602)

IDisposable 是避免常見例外和問題的一個非常有效的方法,處理實作了這個介面的類時,一定要使用 using 陳述句,

只有當一個類實作了 IDisposable 時,才能在 “using” 陳述句中使用這個類;否則,程式將不能編譯,

如果想在 using 陳述句中使用你的物件,它必須實作 IDisposable ,

IDisposable 介面只有一個成員 : Dispose() 方法,這個方法中的所有代碼都會在 using 陳述句的最后執行 ······ 或者手動呼叫 Dispose() 時執行,

實作 Dispose 的一個原則是你的 Dispose() 方法可以呼叫多次而沒有任何副作用,

(P604)

要記住,如果你的代碼沒有處理一個例外,這個例外會在呼叫堆疊中向上傳遞,讓例外向上傳遞是一種完全合法的例外處理方法,有時這比使用一個 try / catch 塊來處理例外可能更合適,

(P606)

只要使用流就應當使用 using 塊! 切記,切記,切記!

【第13章】

(P618)

最侄訓方法不能有引數,因為只需要告訴 .NET “搞定!” 就行了,除此之外不需要再說其他的,

(P619)

物件的最侄訓方法在所有參考都消失之后運行,而且是在物件被垃圾回收之前,物件的所有參考都消失時才會發生垃圾回收,不過,并不是參考一消失就進行垃圾回收,

如果不是一個 “玩具” 性的程式,就不要使用 GC.Collect() ,這是一個很糟糕的做法,這一點再強調也不為過,因為這會干擾 CLR 的垃圾回收器,但這個方法非常適合用來學習垃圾回收和最侄訓方法,

(P627)

struct 可以實作介面,不過不能派生其他類,另外 struct 是密封的,所以不能派生 struct ,

struct 不是物件,它們可以有方法和欄位,但是不能有最侄訓方法, struct 不能繼承其他類或 struct ,也不能被其他的類或 struct 繼承,

(P630)

設定一個 struct 等于另一個 struct 時,就是在為該 struct 中的資料創建一個全新的副本,這是因為 struct 是一個值型別,

(P634)

通過使用 out 引數,方法可以回傳多個值,

每次呼叫一個有 out 引數的方法時,傳入實參時都要使用 out 關鍵字,

(P636)

如果希望方法有默認值,可以使用可選引數和命名引數,

(P637)

只需要在值型別后面增加一個問號 (?) ,它就會變成一個可為空的型別,可以將它設定為 null ,

每個可為空的型別都有一個名為 Value 的屬性,可以獲取或設定這個值,

它們還有一個名為 HasValue 的屬性,如果值不為 null 就會回傳 true ,

值型別都可以轉換為一個可為空的型別,

不過要把可為空的型別再賦給一個值型別,則需要進行強制轉換,

如果 HasValue 為 false , Value 屬性會拋出一個 InvalidOperationException 例外,強制型別轉換也同樣會拋出這個例外 (因為強制轉換等價于使用 Value 屬性) ,

(P640)

如果希望為類提供很好的封裝, struct 會很有意義,因為回傳一個 struct 的只讀屬性會建立它的一個全新副本,

(P642)

擴展方法總是靜態方法,而且必須放在靜態類中,

(P644)

定義擴展方法的類必須是一個靜態類,

(P648)

記住, as 關鍵字只用于類,不能用于 struct ,

【第14章】

(P653)

使用 LINQ 呼叫的方法實際上就是用來擴展陣列的一些擴展方法,

(P667)

Take() 從 LINQ 查詢的第一個結果集中取出指定數目的資料項,可以把這些資料項放在另一個 var 中,然后再把它轉換到一個串列中,

利用 LINQ ,可以撰寫查詢使用很少的代碼完成非常復雜的作業,

(P670)

from 子句會完成兩個作業 : 它告訴 LINQ 查詢使用哪個集合,另外為要查詢的集合中的各個成員指定一個名字,

select 子句告訴 LINQ 這個序列中應該有什么,

(P679)

每個組包含一個共同的成員,稱為“組鍵”,使用 “by” 關鍵字來指定組鍵,每個組序列有一個 Key 成員,其中包含這個組的組鍵,

【第15章】

(P702)

你希望物件只考慮它自己,而不考慮其他物件,這里就分離了各個物件的關注點,

(P704)

一個事件有一個發布者,而且可以有多個訂購者,

(P705)

事件采用先來先服務的原則進行處理,最先訂購的物件最先得到通知,

(P706)

event 關鍵字后面是 EventHandler ,它不是 C# 的保留字,這是 .NET 中定義的一個關鍵字,之所以需要這個關鍵字,是為了告訴訂購這個事件的物件 : 它們的事件處理方法應該是什么樣子,

使用 EventHandler 時,就是在告訴其他物件它們的事件處理方法應當有兩個引數,一個是名為 sender 的 object ,另一個引數是一個 EventArgs 參考,名為 e , sender 是產生事件的那個物件的參考, e 是 EventArgs 物件的一個參考,

(P709)

EventHandler 的作用就是定義事件的簽名,它告訴訂購這個事件的物件該如何定義事件處理方法,

一個事件總由一個物件產生,但是一個事件可以由多個物件回應,

(P716)

EventHandler 的泛型引數必須是 EventArgs 的一個子類,

(P731)

創建一個委托時,只需要為這個委托指向的方法指定方法簽名,

為工程增加一個委托時,就是在增加一個委托型別 (delegate type) ,用它創建一個欄位或變數時,就是在創建這個委托型別的一個實體,

(P732)

委托總是出現在所有其他類外面,

(P738)

回呼是另一種使用委托的方式,

(P739)

向工程增加一個委托,就是在創建一個新型別,可以存盤方法的參考,

事件使用委托來通知物件有某些動作發生,

如果物件需要對某個物件中發生的事情做出反應,可以訂購這個物件的事件,

EventHandler 是一種委托,處理事件時這個委托很常用,

可以把多個事件處理方法串鏈到一個事件上,因此要用 “+=” 為事件設定事件處理方法,

在使用事件或委托之前,一定要檢查是否非 null ,以防止出現 NullReferenceException 例外,

一個物件將一個方法的參考傳入另一個物件,使它 (只有它) 能回傳資訊,這就稱為一個回呼,

利用事件,任何方法都可以匿名地訂購物件的事件,而回呼允許物件控制接收哪些委托,

回呼和事件都使用委托來參考和呼叫其他物件中的方法,

(P740)

“回呼” 只是使用委托 (或事件,完全可以使用一個私有事件來建立回呼) 的一種方法,回呼只是在兩個類之間建立一種關系,一個物件可以請求另一個物件的通知,相比之下,在事件中,則是一個物件要求得到事件通知,

【第16章】

(P749)

視圖模型就像是水管,利用一些工具 (你已經知道如何使用這些工具) 把視圖中的物件連接到模型中的物件,

(P764)

模型可以觸發一個事件,告訴應用的其余部分某個重要的狀態發生了變化,而不需要參考模型以外的類,這樣更容易構建,因為它與其余的 MVVM 層是解耦合的,

(P781)

MVVM 模式將視圖與視圖模型解耦合,另外將視圖模型與模型解耦合,

(P794)

把輔助方法放在一個靜態類中,而且類名以 “Helper” 結尾可以讓你的代碼更易讀,

(P795)

標志為 readonly (只讀) 的欄位只能在宣告或建構式中修改,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/56671.html

標籤:C#

上一篇:深入淺出C#結構體——封裝以太網心跳包的結構為例

下一篇:使用物件初始值設定項初始化

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more