C#的關鍵字都很熟悉,但是有的不經常用,想不起來,最近看下MSDN,做一下總結。
概要:
- 類型關鍵字:a.值類型;b.引用類型;c.指針類型;d.void;e.var
- 修飾符:a.訪問修飾符;b.abstract;c.asyn;d.const;e.event;f.extern;g.in;h.out;i.override;j.readonly;k.sealed;l.static;m.unsafe;n.virtual;o.volatile
- 語句關鍵字:a.yield;b.checked;c.unchecked;d.fixed;e.lock
- 方法參數:a.params;b.ref;c.out
- 命名空間關鍵字:a.namespace;b.using指令;c.using語句
- 運算符關鍵字:a.as;b.await;c.is;d.new;e.sizeof;f.typeof;g.true,false;h.stackalloc;i.nameof
- 轉換關鍵字:a.explicit;b.implicit;c.operator
- 訪問關鍵字:a.base;b.this
- 文字關鍵字:a.null;b.default
- 上下文關鍵字:a.add/remove;b.get;c.global;d.partial類型;e.partial方法;f.set;g.where;h.value;i.yield
- 查詢關鍵字
關鍵字是對編譯器具有特殊意義的預定義保留標識符。它們不能在程序中用作標識符,除非它們有一個 @ 前綴。
1.類型關鍵字
值類型的變量存儲數據,而引用類型的變量存儲對實際數據的引用。引用類型也稱為對象。指針類型僅可用於 unsafe 模式。
通過裝箱和取消裝箱,可以將值類型轉換為引用類型,然后再轉換回值類型。除了裝箱值類型外,無法將引用類型轉換為值類型。
a.值類型,基於值類型的變量直接包含值。將一個值類型變量賦給另一個值類型變量時,將復制包含的值。這與引用類型變量的賦值不同,引用類型變量的賦值只復制對對象的引用,而不復制對象本身。與引用類型不同,值類型無法包含 null 值。但是,可以為 null 的類型 功能允許值類型分配給 null,比如int?。
a1.結構(struct),數值類型,整形(sbyte,byte,char,short,ushort,int,uint,long,ulong)、浮點型(float,double)、decimal;
bool;
用戶定義的結構。
a2.枚舉(enum)
b.引用類型,引用類型的變量存儲對其數據(對象)的引用,而值類型的變量直接包含其數據。對於引用類型,兩種變量可引用同一對象;因此,對一個變量執行的操作會影響另一個變量所引用的對象。對於值類型,每個變量都具有其自己的數據副本,對一個變量執行的操作不會影響另一個變量(ref 和 out 參數變量除外)。
聲明引用類型:class,類只能從一個基類繼承實現。 但是,一個類可以實現一個以上的接口。類成員,包括嵌套選件類,可以是 public、protected internal、protected、internal或 private。 默認情況下成員是 private。
interface,接口只包含方法、屬性、事件或索引器的簽名。 實現接口的類或結構必須實現接口定義中指定的接口成員。
delegate,委托類型的聲明與方法簽名相似, 有一個返回值和任意數目任意類型的參數。delegate 是一種可用於封裝命名或匿名方法的引用類型。 委托類似於 C++ 中的函數指針;但是,委托是類型安全和可靠的。
內置引用類型:
dynamic,該類型的作用是繞過編譯時類型檢查,改為在運行時解析這些操作。
object,在 C# 的統一類型系統中,所有類型(預定義類型、用戶定義類型、引用類型和值類型)都是直接或間接從 Object 繼承的。 可以將任何類型的值賦給 object 類型的變量。 將值類型的變量轉換為對象的過程稱為“裝箱”。 將對象類型的變量轉換為值類型的過程稱為“”。
string,原義字符串以 @ 開頭並且也用雙引號引起來,不處理轉義序列,因此很容易寫入。
內插字符串,用於構造字符串。 內插字符串表達式類似於包含表達式的模板字符串。 內插字符串表達式通過將包含的表達式替換為表達式結果的 ToString 表示形式來創建字符串。
c.指針類型,僅可用於 unsafe 模式。https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx
不安全代碼具有下列屬性:
-
方法、類型和可被定義為不安全的代碼塊。
-
在某些情況下,通過移除數組界限檢查,不安全代碼可提高應用程序的性能。
-
當調用需要指針的本機函數時,需要使用不安全代碼。
-
使用不安全代碼將引起安全風險和穩定性風險。
-
在 C# 中,為了編譯不安全代碼,必須用 unsafe 編譯應用程序。
d.void,當用在方法的返回類型,表示不返回值;在不安全上下文中使用 void 將指針聲明為未知類型。
e.var,隱式類型。
————————————整形表————————————
————————————浮點型表————————————
————————————默認值表————————————
2.修飾符
a.訪問修飾符
public:訪問不受限制。
protected:訪問僅限於包含類或從包含類派生的類型。
Internal:訪問僅限於當前程序集。
protected internal:訪問限制到當前程序集或從包含派生的類型的類別。
private:訪問僅限於包含類型。
b.abstract,指示所修飾的內容缺少實現或未完全實現。 abstract 修飾符可用於類、方法、屬性、索引器和事件。 在類聲明中使用 abstract 修飾符以指示某個類只能是其他類的基類。 標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。
c.async,可將方法、lambda 表達式或匿名方法指定為異步。如果對方法或表達式使用此修飾符,則其稱為異步方法。
d.const,常量可以為數字、布爾值、字符串或 null 引用。
e.event,event 關鍵字用於在發行者類中聲明事件。
f.extern,用於聲明在外部實現的方法。 extern 修飾符的常見用法是在使用 Interop 服務調入非托管代碼時與 DllImport 特性一起使用。,在這種情況下,還必須將方法聲明為 static。extern 關鍵字還可以定義外部程序集別名,使得可以從單個程序集中引用同一組件的不同版本。
g.in,對於泛型類型參數,in 關鍵字指定該類型參數是逆變的。 可以在泛型接口和委托中使用 in 關鍵字。通過逆變,可以使用與泛型參數指定的派生類型相比,派生程度更小的類型。 這樣可以對委托類型和實現變體接口的類進行隱式轉換。 引用類型支持泛型類型參數中的協變和逆變,但值類型不支持。在泛型接口或委托中,如果類型形參僅用作方法返回類型,而不用於方法實參,則可聲明為協變的。 Ref 和 out 參數不能為變體。如果接口具有逆變類型形參,則允許其方法接受與接口類型形參指定的派生類型相比,派生程度更小的類型的實參。 例如,由於在 .NET Framework 4 的 IComparer<T> 接口中,類型 T 是逆變的,因此如果 Employee 繼承 Person,則無需使用任何特殊轉換方法,就可以將 IComparer(Of Person) 類型的對象指派給 IComparer(Of Employee) 類型的對象。可以向逆變委托分配同一類型的其他委托,但需使用派生程度較小的泛型類型參數。
h.out,對於泛型類型參數,out 關鍵字指定該類型參數是協變的。 可以在泛型接口和委托中使用 out 關鍵字。通過協變,可以使用與泛型參數指定的派生類型相比,派生程度更大的類型。 這樣可以對委托類型和實現變體接口的類進行隱式轉換。 引用類型支持協變和逆變,但值類型不支持。如果接口具有協變類型形參,則允許其方法返回與接口類型形參指定的派生類型相比,派生程度更大的類型的實參。 例如,由於在 .NET Framework 4 的 IEnumerable<T> 接口中,類型 T 是協變的,因此無需使用任何特殊轉換方法就可以將 IEnumerabe(Of String) 類型的對象分配給 IEnumerable(Of Object) 類型的對象。可以向協變委托分配同一類型的其他委托,但需使用派生程度較大的泛型類型參數。
(協變和逆變允許數組類型、委托類型和泛型類型參數進行隱式引用轉換。)
i.override,要擴展或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用 override 修飾符。不能重寫非虛方法或靜態方法。 重寫的基方法必須是 virtual、abstract 或 override 的。
j.readonly,readonly 字段可以在聲明或構造函數中初始化,readonly 字段可用於運行時常量。const 字段只能在該字段的聲明中初始化,const 字段是編譯時常量。
k.sealed,當對一個類應用 sealed 修飾符時,此修飾符會阻止其他類從該類繼承。
l.static,使用 static 修飾符聲明屬於類型本身而不是屬於特定對象的靜態成員。
m.unsafe,表示不安全上下文,該上下文是任何涉及指針的操作所必需的。
n.virtual,用於修飾方法、屬性、索引器或事件聲明,並使它們可以在派生類中被重寫。
o.volatile,指示一個字段可以由多個同時執行的線程修改。 聲明為 volatile 的字段不受編譯器優化(假定由單個線程訪問)的限制。 這樣可以確保該字段在任何時間呈現的都是最新的值。volatile 修飾符通常用於由多個線程訪問但不使用 lock 語句對訪問進行序列化的字段。
3.語句關鍵字
a.yield,表示所在的方法、運算符或 get 訪問器是迭代器。
b.checked,用於對整型算術運算和轉換顯式啟用溢出檢查。默認情況下,如果表達式僅包含常數值,且產生的值在目標類型范圍之外,則它會導致編譯器錯誤。 如果表達式包含一個或多個非常數值,則編譯器不檢測溢出。使用 checked 表達式或 checked 塊,在運行時檢測由前面的求和計算導致的溢出。可以使用 unchecked 關鍵字阻止溢出檢查。
c.unchecked,因為溢出檢查比較耗時,所以當無溢出危險時,使用不檢查的代碼可以提高性能。
d.fixed,禁止垃圾回收器重定位可移動的變量。 fixed 語句只在不安全的上下文中是允許的。 fixed 還可用於創建固定大小緩沖區。
e.lock,將語句塊標記為臨界區,方法是獲取給定對象的互斥鎖,執行語句,然后釋放該鎖。lock 關鍵字可確保當一個線程位於代碼的臨界區時,另一個線程不會進入該臨界區。 如果其他線程嘗試進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
4.方法參數
a.params,可以指定采用數目可變的參數的方法參數。
b.ref,ref 關鍵字會導致參數通過引用傳遞,而不是通過值傳遞。類的成員不能具有僅在 ref 和 out 方面不同的簽名。
c.out,通過引用傳遞參數。這與 ref 關鍵字相似,只不過 ref 要求在傳遞之前初始化變量。若要使用 out 參數,方法定義和調用方法均必須顯式使用 out 關鍵字。
5.命名空間關鍵字
a.namespace,用於聲明一組相關對象的大小,可以使用命名空間組織代碼元素和創建全局唯一類型。
b.using指令,用於為命名空間創建別名或導入其他命名空間中定義的類型。允許在命名空間中使用類型,這樣無需在該命名空間中限定某個類型的使用;允許訪問類型的靜態成員,而無需限定使用類型名稱進行訪問;為命名空間或類型創建別名。 這稱為 using 別名指令
c.using語句,用於定義一個范圍,在此范圍的末尾將釋放對象,提供能確保正確使用 IDisposable 對象的方便語法。
6.運算符關鍵字
a.as,執行類型轉換在兼容的引用類型或可以為 null 的類型。as 運算符類似於強制轉換操作。 但是,因此,如果轉換是不可能的,as 返回 null 而不引發異常。as 運算符只執行引用轉換、nullable 轉換和裝箱轉換,不能執行其他轉換,如用戶定義的轉換。
b.await,在異步方法應用於任務,以掛起執行方法,直到所等待的任務完成。 這個任務表示正在進行的工作。在其中使用 await 的異步方法必須通過 async 關鍵字進行修改。使用 async 修飾符定義並且通常包含一個或多個 await 表達式的這類方法稱為異步方法。
c.is,檢查對象是否與給定類型兼容。如果所提供的表達式非空,並且所提供的對象可以強制轉換為所提供的類型而不會導致引發異常,則 is 表達式的計算結果將是 true。is 運算符只考慮引用轉換、裝箱轉換和取消裝箱轉換。 不考慮其他轉換,如用戶定義的轉換。
d.new,運算符用於創建對象和調用構造函數、創建匿名類型的實例、用於調用值類型的默認構造函數。
在用作聲明修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。 隱藏繼承的成員時,該成員的派生版本將替換基類版本。
new 約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。 如果要使用 new 約束,則該類型不能為抽象類型。
e.sizeof,用於獲取非托管類型的大小(以字節為單位),包括枚舉類型、指針類型,用戶定義的結構,不包含任何屬於引用類型的字段或屬性。
f.typeof,用於獲取類型的 System.Type 對象。若要獲取表達式的運行時類型,可以使用 .NET Framework 方法 GetType,
g.true,false
h.stackalloc,用於不安全的代碼上下文中,以便在堆棧上分配內存塊,僅在局部變量的初始值中有效。
i.nameof,用於獲取變量、類型或成員的簡單(非限定)字符串名稱。
7.轉換關鍵字
a.explicit,用於聲明必須使用強制轉換來調用的用戶定義的類型轉換運算符。
b.implicit,用於聲明隱式的用戶定義類型轉換運算符。 如果可以確保轉換過程不會造成數據丟失,則可使用該關鍵字在用戶定義類型和其他類型之間進行隱式轉換。
c.operator,重載內置運算符,或提供類或結構聲明中的用戶定義轉換。
8.訪問關鍵字
a.base,用於從派生類中訪問基類的成員,所訪問的基類是類聲明中指定的基類。
b.this,引用類的當前實例,還可用作擴展方法的第一個參數的修飾符。
9.文字關鍵字
a.null,表示不引用任何對象的 null 引用的文字值。
b.default,可在 switch 語句或泛型代碼中使用。在switch 語句中指定默認標簽;在泛型代碼中,指定類型參數的默認值,對於引用類型為 null,對於值類型為零。
10.上下文關鍵字
a.add/remove,add 上下文關鍵字用於定義一個自定義事件訪問器,當客戶端代碼訂閱您的事件時將調用該訪問器。如果提供自定義 add 訪問器,還必須提供 remove訪問器。
b.get,在屬性或索引器中定義訪問器方法,以檢索該屬性或該索引器元素的值。
c.global,在 :: 運算符前面使用的 global 上下文關鍵字引用全局命名空間,該命名空間是任何 C# 程序的默認命名空間,未以其他方式命名。
d.partial類型,分部類型定義允許將類、結構或接口的定義拆分到多個文件中。
e.partial方法,在分部類型的一個部分中定義它的簽名,並在該類型的另外一個部分中定義它的實現。類設計人員可以使用分部方法提供由開發人員決定是否實現的方法掛鈎(類似於事件處理程序)。如果開發人員沒有提供實現,則編譯器會在編譯時移除簽名。下列條件適用於分部方法:分部類型的兩個部分中的簽名必須匹配;方法必須返回 void;沒有允許的訪問修飾符。分部方法是隱式私有的。
f.set,在屬性或索引器中定義為該屬性或索引器元素賦值的訪問器方法。
g.where,在泛型類型定義中,where 子句用於指定對下列類型的約束:這些類型可用作泛型聲明中定義的類型參數的實參。除了接口約束,where 子句還可以包括基類約束,以指出某個類型必須將指定的類作為基類(或者就是該類本身),才能用作該泛型類型的類型參數。where 子句還可以包括構造函數約束。 可以使用 new 運算符創建類型參數的實例;但類型參數為此必須受構造函數約束 new() 的約束。 new() 約束可以讓編譯器知道:提供的任何類型參數都必須具有可訪問的無參數(或默認)構造函數。
h.value,用在普通屬性聲明的 set 訪問器中。 此關鍵字類似於方法的輸入參數。 關鍵字 value 引用客戶端代碼嘗試賦給屬性的值。
i.yield,在語句中使用 yield 關鍵字,表示在該關鍵字所在的方法、運算符或 get 訪問器是迭代器。 通過使用 yield 定義迭代器,可在實現自定義集合類型的IEnumerable 和 IEnumerator 模式時無需其他顯式類。
11.查詢關鍵字。曾做過總結http://www.cnblogs.com/belloworld/p/5227226.html