主頁 >  其他 > 《深入理解 C# (第2版)》 - 學習筆記

《深入理解 C# (第2版)》 - 學習筆記

2020-09-18 01:03:25 其他

《深入理解 C#》 (第2版)

========== ========== ==========
[作者] (英) Jon Skeet
[譯者] (中) 周靖 朱永光 姚琪琳
[出版] 人民郵電出版社
[版次] 2012年01月 第1版
[印次] 2012年01月 第1次 印刷
[定價] 79.00元
========== ========== ==========

【關于本書】

具體地說, C# 作為一種語言,它的基礎是各種各樣的 “框架庫” (.NET Framework 中的各種庫) 以及一個強大的運行時 (runtime) ,借助它們,我們可以將抽象的東西轉變成現實,

【第01章】

(P013)

LINQ (Language Integrated Query , 語言集成查詢) ,是 C# 3 的核心之所在,顧名思義, LINQ 是關于查詢的,其目的是使用一致的語法和特性,以一種易閱讀、可組合的方式,使對多資料源的查詢變得簡單,

(P014)

查詢運算式唯一的好處就是 where 子句顯得更簡單,

【第02章】

(P023)

實際上,委托在某種程度上提供了間接的方法,換言之,不需要直接指定一個行為,而是將這個行為用某種方式 “包含” 在一個物件中,

可以選擇將委托型別看做只定義了一個方法的介面,將委托的實體看做實作了那個介面的一個物件,

(P024)

為了讓委托做某事,必須滿足4個條件 :

1. 宣告委托型別;

2. 必須有一個方法包含了要執行的代碼;

3. 必須創建一個委托實體;

4. 必須呼叫 (invoke) 委托實體;

(P026)

如果有一個委托型別的變數,就可以把它視為方法本身,

(P028)

委托實體實際有一個操作串列與之關聯,這稱為委托實體的呼叫串列 (invocation list) ,

System.Delegate 型別的靜態方法 Combine 和 Remove 負責創建新的委托實體,其中, Combine 負責將兩個委托實體的呼叫串列連接到一起,而 Remove 負責從一個委托實體中洗掉另一個的呼叫串列,

委托是不易變的,創建了一個委托實體后,有關它的一切就不能改變,這樣一來,就可以安全地傳遞委托實體,并把它們與其他委托實體合并,同時不必擔心一致性、執行緒安全性或者是否有其他人試圖更改它的操作,

(P029)

事件不是委托型別的欄位,

對于事件來說,必須是一個委托型別,

(P030)

對于一個純粹的事件,你所能做的事情就是訂閱 (添加一個事件處理程式) 或者取消訂閱 (洗掉一個事件處理程式) ,

類內的代碼能看見欄位;類外的代碼只能看見事件,

(P037)

陣列型別是參考型別,即使元素型別是值型別,

列舉是值型別,

委托型別是參考型別,

介面型別是參考型別,但可由值型別實作,

(P039)

變數的值是在它宣告的位置存盤的,

只有區域變數 (方法內部宣告的變數) 和方法引數在堆疊上,

(P040)

當你呼叫型別變數值的 GetType() 方法時總是伴隨著裝箱程序,因為它不能被多載,

(P041)

參考型別作為方法引數使用時,引數默認是以 “值傳遞” 方式來傳遞的 —— 但值本身是一個參考,

【第03章】

(P047)

所謂 “函式化” 的編程風格,是指鼓勵開發者更多地利用委托,

(P048)

從根本上說,泛型實作了型別和方法的 “引數化” ,就像在普通的方法呼叫中,經常要用引數來告訴它們使用什么值,

(P052)

型別引數是真實型別的占位符,

在泛型宣告中,型別引數要放在一對尖括號內,并以逗號分隔,

使用泛型型別或方法時,要用真實的型別代替,這些真實的型別稱為型別實參 (type argument) ,

如果沒有為任何型別引數提供型別實參,宣告的就是一個未系結泛型型別 (unbound generic type) ,如果指定了型別實參,該型別就稱為一個已構造型別 (constructed type) ,

我們知道,型別 (無論是否是泛型) 可以看做是物件的藍圖,同樣,未系結泛型型別是已構造型別的藍圖,

在 C# 代碼中,唯一能看見未系結泛型型別的地方 (除了作為宣告之外) 就是在 typeof 運算子內,

型別引數 “接收” 資訊,型別實參 “提供” 資訊,這個思路與 方法引數 / 方法實參 是一樣的,只不過型別實參必須為型別,而不能為任意的值,只有在編譯時才能知道型別實參的型別,它可以是 (或包含) 相關背景關系中的型別引數,

(P054)

泛型型別可以多載,只需改變一下型別引數的數量就可以了,

(P057)

將 API 的一部分變成泛型后,以前強型別的方法呼叫就需要進行強制型別轉換,

(P062)

呼叫泛型方法時,指定型別實參常常會顯得很多余,

型別推斷只適用于泛型方法,不適用于泛型型別,

(P063)

在 C# 語言規范中,只提供了數量有限的推斷步驟,

雖然很少需要用到默認值,但它偶爾還是有用的,

(P064)

輸出引數也稱為 out 引數,如果希望由方法本身初始化引數,允許向方法傳遞一個未初始化的實參,那么在宣告引數時,就要附加 out 關鍵字作為前綴,

(P066)

共有 4 個主要的泛型介面可用于比較, IComparer<T> 和 IComparable<T> 用于排序 (判斷某個值是小于、等于還是大于另一個值) ,而 IEqualityComparer<T> 和 IEquatable<T> 通過某種標準來比較兩個項的相等性,或查找某個項的散列 (通過與相等性概念匹配的方式) ,

如果換一種方式來劃分這 4 個介面, IComparer<T> 和 IEqualityComparer<T> 用于那些能夠比較兩個不同值的型別,而 IComparable<T> 和 IEquatable<T> 的實體則用于它們本身和其他值之間的比較,

(P073)

一個基本的原則是,如果沒有問題,泛型介面都應該繼承對應的非泛型介面,這樣可以實作協變性,

(P074)

實作介面所規定的的方法或屬性時,附加介面名作為前綴,即稱為 “顯式介面實作” ,

(P075)

反射的一切都是圍繞 “檢查物件及其型別” 展開的,

(P078)

泛型不支持協變性 —— 它們是不變體,

【第04章】

(P091)

Nullable<T> 最重要的部分就是它的屬性,即 HasValue 和 Value ,

(P092)

Nullable<T> 引入了一個名為 GetValueOrDefault 的新方法,它有兩個多載方法,兩者均在存在一個實體的前提下回傳該實體的值,否則回傳一個默認值,其中一個多載方法沒有任何引數 (在這種情況下會使用基礎型別的泛型默認值) ,另一個多載方法則允許你指定要回傳的默認值,

【第05章】

(P114)

C# 2 支持從方法組到一個兼容委托型別的隱式轉換,

(P117)

根據約定,事件處理方法應具有包含兩個引數的簽名,第 1 個引數是 object 型別,代表事件的來源;第 2 個引數則負責攜帶與事件有關的任何額外資訊,該引數是從 EventArgs 派生的一個型別,

回傳型別協變性和引數型別逆變性可以同時使用,雖然這樣做幾乎沒有任何實際的用處,

(P119)

.NET 2.0 引入了一個泛型委托型別 Action<T> ,我們將在例子中使用委托,它的簽名非常簡單 (除了它是泛型這一事實以外) : public delegate void Action<T>(T obj) ,

(P120)

匿名方法的語法 : 先是 delegate 關鍵字,再是引數 (如果有的話) ,隨后是一個代碼塊,其中包含了對委托實體的操作進行定義的代碼,

基本上,在普通方法主體中能做的事情,在匿名方法中都能做,同樣,匿名方法的結果是一個委托實體,可以像使用其他委托實體那樣使用它,

逆變性不適用于匿名方法,必須指定和委托型別完全匹配的引數型別,

(P121)

Action<T> 委托的回傳型別是 void ,所以不必從匿名方法回傳任何東西,

.NET 2.0 中的 Predicate<T> 委托型別,下面列出了它的簽名 : public delegate bool Predicate<T>(T obj) ,

(P122)

謂語通常在需要篩選和匹配操作中使用,

Predicate<T> 型別宣告的回傳型別恰好是 bool ,

(P124)

匿名方法是 C# 2 以被捕捉的變數的形式來實作,在別的地方成為閉包的一個特性,

(P125)

匿名方法能使用在宣告該匿名方法的方法內部定義的區域變數,

(P127)

簡單地說,捕獲變數能簡化編程,避免專門創建一些類來存盤一個委托需要處理的資訊 (作為引數傳遞的資訊除外) ,

FindAll 的引數是一個 Predicate<T> 委托,

【第06章】

(P138)

如果方法宣告的回傳型別是非泛型介面,那么迭代器塊的生成型別 (yield type) 是 object ,否則就是泛型介面的型別引數,

在迭代器中不允許包含普通的 return 陳述句 —— 只能是 yield return ,

(P141)

迭代器代碼塊不能實作具有 ref 或 out 引數的方法,

(P143)

只要呼叫者使用了 foreach 回圈,迭代器塊中的 finally 將按照你期望的方式作業,

(P147)

迭代器方法中的 using 陳述句扮演了 try / finally 塊的角色,

(P148)

LINQ 的核心特性之一,是使用 Where 方法進行篩選,

【第07章】

(P154)

創建分部型別是非常容易做的事情 —— 你只需在涉及的每個檔案的型別的宣告部分附加一個背景關系關鍵字 partial ,

(P158)

分部方法的宣告方式與抽象方法相同 : 只使用 partial 修飾符提供簽名而無須任何實作,同樣,實際的實作還需要 partial 修飾符,不然就和普通方法一樣了,

由于方法可能不存在,分部方法必須具有 void 回傳型別,不能獲取 out 引數,它們必須是私有的,不過可以是靜態的 并且 / 或是 泛型的,如果方法沒有在任何檔案中實作,那么整個呼叫陳述句就會被移除,包括任何引數的計算陳述句,

(P159)

實際上如果不存在可見的建構式 (包括受保護的) ,那么類實際上也就是密封的了,

(P160)

如果你不為類提供任何建構式,那么 C# 1 編譯器總是會提供一個公有的默認的無引數建構式,

我們不希望出現任何可見的建構式,所以不得不提供一個私有的,

C# 2 編譯器知道靜態類不用包含任何建構式,所以它也不會提供默認的,實際上,編譯器在類定義上執行了大量的約束 :

1. 類不能宣告為 abstract 或 sealed ,雖然兩者都是隱含宣告的;

2. 類不能設定任何要實作的介面;

3. 類不能設定基型別;

4. 類不能包含任何非靜態成員,包括建構式;

5. 類不能包含任何運算子;

6. 類不能包含任何 protected 或 protected internal 成員;

應當注意,即使所有成員都必須為靜態的,你還是要把它們都顯式地宣告為靜態的,除了嵌套型別和常量,雖然嵌套型別是外圍類的隱式靜態成員,不過如果不要求的話,嵌套型別本身可以不用是靜態的,

(P161)

讓類成為靜態的,就是在說你絕對不會創建該類的任何實體,

在 C# 1 中取值方法和賦值方法必須具有相同的可訪問性 —— 它作為屬性宣告的一部分進行宣告,而不是作為取值方法或賦值方法宣告的一部分進行宣告的,

(P162)

在 C# 的其他地方,在給定的情況下,默認的訪問修飾符可能大部分都是私有的,換句話說,如果某些內容能被宣告為私有,那么省略的訪問修飾符就被完全默認為私有,這是一種很好的語言設計元素,因為這樣很難意外地發生錯誤 : 如果你希望某些內容更加公開,在你使用它的時候會注意到,

如果你不設定任何東西,那么默認情況下 取值方法 / 賦值方法 和屬性本身整體上保持一致的訪問修飾符,

還要注意,你不能把屬性本身宣告為私有,而讓取值方法是公有的 —— 你只能設定比屬性更私有的特殊 取值方法 / 賦值方法 ,

C# 1 的 using 指令能夠用于兩種情況 —— 一種是為命名空間和型別創建一個別名,另外一種就是將一個命名空間引入到當編譯器查找某個型別時可以搜索到的背景關系串列中,

在 C# 2 中,有 3 種別名種類 : C# 1 的命名空間別名、全域命名空間別名和外部別名,

(P166)

對 pragma 指令進行描述通常都非常簡單 : pragma 指令就是一個由 #pragma 開頭的代碼行所表示的預處理指令,它后面能包含任何文本,

【第08章】

(P178)

不能在所有情況下為所有變數都使用隱式型別,只有在以下情況下才能用它 :

1. 被宣告的變數是一個區域變數,而不是靜態欄位和實體欄位;

2. 變數在宣告的同時被初始化;

3. 初始化運算式不是一個方法組,也不是一個匿名函式 (不進行強制型別轉換) ;

4. 初始化運算式不是 null ;

5. 陳述句中只宣告了一個變數;

6. 你希望變數擁有的型別是初始化運算式的編譯時型別;

7. 初始化運算式不包含正在宣告的變數;

(P184)

集合初始化串列并非只能應用于串列,任何實作了 IEnumerable 的型別,只要它為初始化串列中出現的每個元素都提供了一個恰當的公有的 Add 方法,就可以使用這個特性,

(P192)

如果你要創建的一個型別只在一個方法中使用,而且其中只包含了欄位和普通屬性,就考慮一下能否使用匿名型別,

(P193)

匿名型別允許你只保留特定情況下需要的資料,這些資料采取的是適用于那種情況的形式,不必每次都單調重復地寫一個新的型別,

隱式型別的陣列和匿名型別只有在與其他 C# 3 特性配合的時候才會體現它們的價值,

【第09章】

(P194)

LINQ 的基本功能就是創建操作管道,以及這些操作需要的任何狀態,這些操作表示了各種關于資料的邏輯 : 如何篩選、如何排序以及如何將不同的資料源聯接到一起,等等,當 LINQ 查詢在 “行程內” 執行時,那些操作通常用委托來表示,

LINQ to Objects 處理的是同一個行程中的資料序列,相比之下,像 LINQ to SQL 這樣的 provider 將作業交給 “行程外” 的系統 (比如資料庫) 去處理,

(P195)

執行委托只是 LINQ 的眾多能力之一,

從許多方面, Lambda 運算式都可以看做是 C# 2 的匿名方法的一種演變,

匿名方法能做的幾乎一切事情都可以用 Lambda 運算式來完成,

匿名方法可以簡明地忽略引數,但 Lambda 運算式不具備的這一特性,

在 .NET 3.5 的 System 命名空間中,有 5 個泛型 Func 委托型別, Func 并無特別之處 —— 只是它提供了一些好用的預定義泛型型別,在很多情況下能幫助我們處理問題,每個委托簽名都獲取 0 ~ 4 個引數,引數型別是用型別引數來指定的,最后一個型別引數用作每種情況下的回傳型別,

(P196)

當你想使用 void 為回傳型別時,可使用 Action<...> 系列的委托,其功能相同,

Action 的單引數的版本在 .NET 2.0 中就有了,但其他都是 .NET 3.5 新增的,

如果 4 個引數還嫌不夠, .NET 4 將 Action<...> 和 Func<...> 家族擴展為擁有 16 個引數,因此 Func<T1, ..., T16, TResult> 擁有讓人欲哭無淚的 17 個型別引數,

Lambda 運算式最冗長的形式是 : { 顯式型別引數串列} => { 陳述句 } ,

=> 部分是 C# 3 新增的,它告訴編譯器我們正使用一個 Lambda 運算式,

(P197)

在閱讀 Lambda 運算式時,可以將 => 部分看成 “goes to” ,

匿名方法中控制回傳陳述句的規則同樣適用于 Lambda 運算式 : 如果回傳型別是 void ,就不能從 Lambda 運算式回傳一個值;如果有一個非 void 的回傳型別,那么每個代碼路徑都必須回傳一個兼容的值,

對于沒有回傳型別的委托,如果只有一條陳述句,也可以使用這種語法,基本上省略分號和大括號,

運算式,不使用大括號,不使用 return 陳述句,也不添加分號 : { 顯式型別的引數串列 } => 運算式 ,

編譯器大多數時候都能猜出引數型別,不需要你顯式宣告它們,在這種情況下,可以將 Lambda 運算式寫成 : ( 隱式型別的引數串列 ) => 運算式 ,

隱式型別的引數串列就是一個以逗號分隔的名稱串列,沒有型別,但隱式和顯式型別的引數不能混合和匹配 —— 要么整個串列都是顯式型別的,要么全部都是隱式型別的,除此之外,如果有任何 out 或 ref 引數,就只能使用顯式型別,

(P198)

如果 Lambda 運算式只需一個引數,而且那個引數可以隱式指定型別, C# 3 就允許省略圓括號,這種格式的 Lambda 運算式是 : 引數名 => 運算式 ,

是否為 Lambda 運算式的主體使用較短的形式 (指定一個運算式來取代一個完整的代碼塊) ,以及是使用顯式還是隱式引數,這兩個決定是完全獨立的,

(P202)

.NET 3.5 的運算式樹提供了一種抽象的方式將一些代碼表示成一個物件樹,

C# 3 對于將 Lambda 運算式轉換成運算式樹提供了內建的支持,

(P205)

Lambda 運算式能顯式或隱式地轉換成恰當的委托實體,

并非所有 Lambda 運算式都能轉換成運算式樹,不能將帶有一個陳述句塊 (即使只有一個 return 陳述句) 的 Lambda 轉換成一個運算式樹 —— 只有對單個運算式進行求值的 Lambda 才可以,

(P208)

沒有 Lambda 運算式,運算式樹幾乎沒有任何價值,

從一定程度上說,反過來說也是成立的 : 沒有運算式樹, Lambda 運算式肯定就沒那么有用了,

(P218)

匿名函式是匿名方法和 Lambda 運算式的統稱,

(P219)

Lambda 運算式要想被編譯器理解,所有引數的型別必須為已知,

在 C# 3 中, Lambda 運算式幾乎完全取代了匿名方法,當然,為了保持向后兼容,匿名方法仍是支持的,

【第10章】

(P220)

C# 3 引入了擴展方法的概念,它既有靜態方法的優點,又使呼叫它們的代碼的可讀性得到了增強,使用擴展方法,可以像呼叫完全不同的類的實體方法那樣呼叫靜態方法,

(P223)

并不是任何方法都能作為擴展方法使用 —— 它必須具有以下特征 :

1. 它必須在一個非嵌套的、非泛型的靜態類中 (所以必須是一個靜態方法) ;

2. 它至少要有一個引數;

3. 第一個引數必須附加 this 關鍵字作為前綴;

4. 第一個引數不能有其他任何修飾符 (比如 out 或 ref) ;

5. 第一個引數的型別不能是指標型別;

(P226)

實體方法肯定會先于擴展方法使用,

在 C# 中,在空參考上呼叫實體方法是不允許的,

可以在空參考上呼叫擴展方法,

(P227)

在框架中,擴展方法最大的用途就是在 LINQ 中使用,

(P229)

Where 擴展方法是對集合進行篩選的一種簡單但又十分強大的方式 : 它接受一個謂詞,后者應用于原始集合中的每個元素, Where 同樣回傳一個 IEnumerable<T> ,但這一次所有與謂詞匹配的元素都被包括到結果集合中,

(P230)

“回傳相同的參考” 模式用于易變型別,而 “回傳新實體 (該實體為原始實體更改后的副本)” 模式則用于不易變型別,

(P233)

LINQ 運算子是無副作用的 : 它們不會影響輸入,也不會改變環境,

(P236)

C# 3 只支持擴展方法而不支持擴展屬性,這稍微限制了流暢介面,

(P239)

我們學東西不應過于急功近利 —— 每次都是為了解決當前的一個實際問題才去學習,

在軟體工程領域,新的模式和實踐準則層出不窮,來自一些系統的設計思想經常會 “流竄” 到另一些系統中,這其實是讓軟體開發始終保持新鮮感的原因之一,

【第11章】

(P241)

序列是 LINQ 的基礎,

(P251)

Cast 通過把每個元素都轉換為目標型別 (遇到不是正確型別的任何元素的時候,就會出錯) 來處理,而 OfType 首先進行一個測驗,以跳過任何具有錯誤型別的元素,

(P254)

編譯器會故意生成一個對 Select 方法的呼叫,即使它什么都沒有做,

查詢運算式的結果和源資料從來就不是同一個物件,除非 LINQ 提供器的代碼有問題,從資料集成的角度看,這是很重要的 —— 提供器能回傳一個易變的結果物件,并知道即使面對一個退化查詢,對回傳資料集的改變也不會影響到 “主” 資料,

(P255)

OrderBy 和 ThenBy 不同之處非常簡單 : OrderBy 假設它對排序規則起決定作用,而 ThenBy 可理解為對之前的一個或多個排序規則起輔助作用,

(P256)

盡管你能使用多個 orderby 子句,但每個都會以它自己的 OrderBy 或 OrderByDescending 子句作為開始,這意味著最后一個才會真正 “獲勝” ,

let 子句只不過引入了一個新的范圍變數,它的值是基于其他范圍變數,語法是極其簡單的 : let 識別符號 = 運算式 ,

(P258)

let 子句使用對 Select 的另一個呼叫,為結果序列創建匿名方法,并最終創建了一個新的范圍變數 (它的名稱在源代碼中從未看到或用到) 來實作目標,

(P260)

如果你打算把一個巨大的序列聯接到一個極小的序列上,應盡可能把小序列作為右邊序列,

(P261)

通常,你希望過濾序列,而在聯接前進行過濾比在聯接后過濾要有效得多,

行內接可用在 SQL 的所有地方,它們實際上是從某個物體導航到相關聯的物體上的一種方式,通常是把某個表的外鍵和另外一個表的主鍵進行聯接,

(P264)

交叉聯接不在序列之間執行任何匹配操作 : 結果包含了每個可能的元素對,

(P268)

分組運算式通過分組鍵決定了序列如何分組,整個結果就是一個序列,序列中的每個元素本身就是投影后元素的序列,還具有一個 Key 屬性,這就是那個用于分組的鍵;這樣的組合是封裝在 IGrouping<TKey, TElement> 介面中的,它擴展了 IEnumerable<TElement> ,

(P270)

查詢延續提供一種方式,把一個查詢運算式的結果用作另外一個查詢運算式的初始序列,它可以應用于 group...by 和 select 子句上,語法對于兩者是一樣的 —— 你只需使用背景關系關鍵字 into ,并為新的范圍變數提供一個名稱就可以了,范圍變數接著能用在查詢運算式的下一部分,

【第12章】

(P277)

LINQ to SQL 需要有關資料庫的元資料,來知道哪個類與哪個資料庫表相對應等資訊,可以用幾種不同的方式來表示這種元資料,而我這里使用的是 Visual Studio 內嵌的 LINQ to SQL 設計器,

【第13章】

(P312)

引數 (也稱為形式引數) 變數是方法或索引器宣告的一部分,而實參是呼叫方法或索引器時使用的運算式,

(P313)

如果某個操作需要多個值,而有些值在每次呼叫的時候又往往是相同的,這時通常可以使用可選引數,

(P314)

指定了默認值的引數為可選引數,

(P315)

可選引數包含一些規則,所有可選引數必須出現在必備引數之后,引數陣列 (用 params 修飾符宣告) 除外,但它們必須出現在引數串列的最后,在它們之前為可選引數,引數陣列不能宣告為可選的,如果呼叫者沒有指定值,將使用空陣列代替,可選引數不能使用 ref 或 out 修飾符,

(P316)

基本上,你必須使用永遠不會改變的真正常量作為可選引數的默認值,

(P318)

如果要對包含 ref 或 out 的引數指定名稱,需要將 ref 或 out 修飾符放在名稱之后,實參之前,

(P319)

實參是按照引數的名稱來匹配的,而不再是引數的位置,

未命名的實參稱為位置實參,

所有命名實參都必須位于位置實參之后,兩者之間的位置不能改變,位置實參總是指向方法宣告中相應的引數 —— 你不能跳過引數之后,再通過命名相應位置的實參來指定,

(P331)

可變性有兩種型別 : 協變性和逆變性,

協變性用于向呼叫者回傳某項操作的值,

逆變性則相反,它指的是呼叫者向 API 傳入的值,即 API 是在消費值,而不是產生值,

(P332)

在泛型介面或委托宣告中, C# 4 能夠使用 out 修飾符來指定型別引數的協變性,使用 in 修飾符來指定逆變性,

任何使用了協變和逆變的轉換都是參考轉換,這意味著轉換之后將回傳相同的參考,它不會創建新的物件,只是認為現有參考與目標型別匹配,

如果型別引數只用于輸出,就使用 out ,如果只用于輸入,就用 in ,

(P337)

只有介面和委托可以擁有可變的型別引數,即使類中包含只用于輸入 (或只用于輸出) 的型別引數,仍然不能為它們指定 in 或 out 修飾符,

【第14章】

(P345)

事實上, dynamic 并不代表一個特定的 CLR 型別,它實際上只是包含 System.Dynamic.DynamicAttribute  特性的 System.Object ,

(P347)

dynamic 可用來宣告型別的欄位、引數和回傳值,這與 var 形成了鮮明的對比,后者只能用于區域變數,

(P355)

如果兩個方法的簽名包含的引數型別相同,編譯器將選擇非泛型多載,而不是泛型多載,

(P362)

dynamic 型別的引數將被視為 object 型別 —— 如果查看編譯后的代碼,將發現它確實為 object 型別的引數,只不過應用了額外的特性,這還意味著在你宣告的方法中,它們的簽名不能只以 dynamic / object 引數型別來進行區分,

(P369)

你不能宣告一個基類為 dynamic 的型別,你同樣不能將 dynamic 用于型別引數的約束,或作為型別所實作的介面的一部分,你可以將其用于基類的型別實參,或在宣告變數時將其用于介面,

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

標籤:其他

上一篇:HtmlAgility 抓取網頁上的資料

下一篇:VoIP和IP電話應用中的供電和冷卻方案下載

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more