# 類型(C# 編程指南)
## 類型、變量和值
C# 是一種強類型語言。每個變量和常量都有一個類型,每個計算為值的表達式也是如此。每個方法簽名為每個輸入參數和返回值指定一個類型。.NET Framework 類庫定義了一組內置數值類型以及表示各種邏輯構造的更復雜的類型,例如文件系統、網絡連接、對象的集合和數組及日期。典型 C# 程序使用類庫中的類型,還使用為特定于該程序問題域的概念建模的用戶定義類型。
類型中存儲的信息可以包括:
* 該類型的變量所需的存儲空間。
* 該類型可以表示的最大值和最小值。
* 該類型包含的成員(方法、字段、事件等)。
* 該類型所繼承的基類型。
* 將在運行時為其分配變量內存的位置。
* 允許的運算種類。
編譯器使用類型信息確保代碼中執行的所有運算都是類型安全的。例如,如果聲明了一個 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx) 類型的變量,則編譯器允許您在加法和減法運算中使用此變量。如果嘗試在一個 [bool](https://msdn.microsoft.com/zh-CN/library/c8f5xwh7.aspx) 類型的變量上執行相同的運算,則編譯器會產生錯誤,如下面的示例所示:
```
int a = 5;
int b = a + 2; //OK
bool test = true;
// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
int c = a + test;
```
|  注意 |
| :-- |
| 請 C 和 C++ 開發人員注意,在 C# 中,[bool](https://msdn.microsoft.com/zh-CN/library/c8f5xwh7.aspx) 不能轉換為 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx)。 |
編譯器將類型信息作為元數據嵌入到可執行文件中。公共語言運行時 (CLR) 會在運行時使用該元數據,以進一步確保它在分配和回收內存時類型安全。
### 在變量聲明中指定類型
在程序中聲明變量或常量時,必須指定其類型或者使用關鍵字 [var](https://msdn.microsoft.com/zh-CN/library/bb383973.aspx) 讓編譯器可以推斷其類型。下面的示例演示了一些使用內置數值類型和復雜的用戶定義類型的變量聲明:
```
// Declaration only:
float temperature;
string name;
MyClass myClass;
// Declaration with initializers (four examples):
char firstLetter = 'C';
var limit = 3;
int[] source = { 0, 1, 2, 3, 4, 5 };
var query = from item in source
where item <= limit
select item;
```
在方法簽名中指定方法參數和返回值的類型。下面的簽名中演示的方法需要用 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx) 作為輸入參數并返回一個字符串:
```
public string GetName(int ID)
{
if (ID < names.Length)
return names[ID];
else
return String.Empty;
}
private string[] names = { "Spencer", "Sally", "Doug" };
```
聲明了一個變量后,不能使用新類型重新對它進行聲明,也不能向它賦與它的聲明類型不兼容的值。例如,不能聲明 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx),然后向它賦予布爾值 [true](https://msdn.microsoft.com/zh-CN/library/06d3w013.aspx)。但是,值可以轉換為其他類型,例如將值賦給新變量或者作為方法參數傳遞時。編譯器會自動執行不會導致數據丟失的類型轉換。可能導致數據丟失的轉換需要源代碼內有強制轉換。
有關詳細信息,請參閱 [強制轉換和類型轉換(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173105.aspx)。
## 內置類型
C# 提供了一組標準的內置數值類型,用來表示整數、浮點值、布爾表達式、文本字符、十進制值和其他數據類型。還有內置的 **string** 和 **object** 類型。您可以在任何 C# 程序中使用這些類型。有關內置類型的更多信息,請參見[類型參考表(C# 參考)](https://msdn.microsoft.com/zh-CN/library/1dhd7f2x.aspx)。
## 自定義類型
您可以使用 [struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx)、[class](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)、[interface](https://msdn.microsoft.com/zh-CN/library/87d83y5b.aspx) 和 [enum](https://msdn.microsoft.com/zh-CN/library/sbbt4032.aspx) 結構創建自己的自定義類型。.NET Framework 類庫本身是 Microsoft 提供的自定義類型的集合,您可以在自己的應用程序中使用它們。默認情況下,類庫中最常用的類型在所有 C# 程序中均可用。而對于其他類型,則僅當您顯式添加定義這些類型的程序集的項目引用后它們才可用。編譯器擁有對該程序集的引用后,才可以在源代碼中聲明在該程序集中聲明的類型的變量(和常量)。有關更多信息,請參見 [.NET Framework Class Library](http://go.microsoft.com/fwlink/?LinkID=217856)(.NET Framework 類庫)。
## 通用類型系統
請務必了解有關 .NET Framework 中的類型系統的以下兩個基本點:
* 它支持繼承原則。類型可從稱為基類型的其他類型派生。派生類型繼承基類型的方法、屬性和其他成員(存在一些限制)。之后,基類型可從某些其他類型派生,這種情況下,派生類型繼承其層次結構中這兩個基類型的成員。包括如 [System.Int32](https://msdn.microsoft.com/zh-CN/library/system.int32.aspx)(C# 關鍵字:[int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx))等內置數值類型在內的所有類型,最終都是從一個基類派生得到的,該基類即 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) (C# 關鍵字:[object](https://msdn.microsoft.com/zh-CN/library/9kkx3h3c.aspx))。這種統一的類型層次結構稱為[常規類型系統](https://msdn.microsoft.com/zh-CN/library/zcx1eb1e.aspx) (CTS)。有關 C# 中的繼承的更多信息,請參見[繼承(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx)。
* CTS 中的每一個類型都被定義成了值類型或引用類型。這包括 .NET Framework 類庫中的所有自定義類型以及您自己的用戶定義類型。使用關鍵字 [struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx) 定義的類型是值類型;所有內置數值類型都是 **structs**。使用關鍵字 [class](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx) 定義的類型是引用類型。引用類型和值類型有不同的編譯時規則和不同的運行時行為。
下圖演示了 CTS 中的值類型和引用類型之間的關系。

CTS 中的值類型和引用類型
|  注意 |
| :-- |
| 可以看到,最常用的類型都組織到了 [System](https://msdn.microsoft.com/zh-CN/library/system.aspx) 命名空間。但是,類型所在的命名空間與類型是值類型還是引用類型沒有關系。 |
### 值類型
值類型是從派生自 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 的 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 派生的。派生自 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 的類型在 CLR 中有特殊行為。值類型變量直接包含它們的值,這意味著內存在聲明變量的任意上下文中都是以內聯方式分配的。值類型變量沒有單獨的堆分配或垃圾回收開銷。
值類型分為兩個類別:[struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx) 和 [enum](https://msdn.microsoft.com/zh-CN/library/sbbt4032.aspx)。
內置數值類型是結構,它們具有可以訪問的屬性和方法。
```
// Static method on type Byte.
byte b = Byte.MaxValue;
```
但是,您可以聲明它們并向它們賦值,就如同它們是簡單的非聚合類型一樣:
```
byte num = 0xA;
int i = 5;
char c = 'Z';
```
例如,值類型是密封的,這意味著您不能從 [System.Int32](https://msdn.microsoft.com/zh-CN/library/system.int32.aspx) 派生類型,并且不能定義一個結構以便從任何用戶定義的類或結構繼承,因為結構只能從 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 繼承。但是,一個結構可以實現一個或更多個接口。可以將結構類型強制轉換為接口類型;但這會使裝箱操作在托管堆上的一個引用類型對象內包裝該結構。在將值類型傳遞給將 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 作為輸入參數的方法時會發生裝箱操作。有關詳細信息,請參閱 [裝箱和取消裝箱(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/yz2be5wk.aspx)。
可以使用 [struct](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx) 關鍵字創建自己的自定義值類型。通常,結構可作為一小組相關變量的容器,如下面的示例所示:
```
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
```
有關結構的更多信息,請參見[結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/saxz13w4.aspx)。有關 .NET Framework 中的值類型的更多信息,請參見[常規類型系統](https://msdn.microsoft.com/zh-CN/library/zcx1eb1e.aspx)。
另一類值類型是 [enum](https://msdn.microsoft.com/zh-CN/library/sbbt4032.aspx)。枚舉定義一組已命名的整數常量。例如,.NET Framework 類庫中的 [System.IO.FileMode](https://msdn.microsoft.com/zh-CN/library/system.io.filemode.aspx) 枚舉包含一組已命名的整數常量,用來指定應如何打開文件。其定義方式如下面的示例所示:
```
public enum FileMode
{
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truncate = 5,
Append = 6,
}
```
**System.IO.FileMode.Create** 常數的值為 2。但是,在閱讀源代碼時,名稱可為人們提供更多信息,因此最好使用枚舉而不使用常量文本數字。有關詳細信息,請參閱 [System.IO.FileMode](https://msdn.microsoft.com/zh-CN/library/system.io.filemode.aspx)。
所有枚舉均是從繼承自 [System.ValueType](https://msdn.microsoft.com/zh-CN/library/system.valuetype.aspx) 的 [System.Enum](https://msdn.microsoft.com/zh-CN/library/system.enum.aspx) 繼承的。所有適用于結構的規則同樣也適用于枚舉。有關枚舉的更多信息,請參見[枚舉類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/cc138362.aspx)。
### 引用類型
定義為[類](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx)、[委托](https://msdn.microsoft.com/zh-CN/library/900fyy8e.aspx)、數組或[接口](https://msdn.microsoft.com/zh-CN/library/87d83y5b.aspx)的類型是引用類型。 在運行時,當您聲明引用類型的變量時,該變量會一直包含值 [null](https://msdn.microsoft.com/zh-CN/library/edakx9da.aspx),直至您使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx) 運算符顯式創建對象的實例,或者為該變量分配已經在其他位置使用 new 創建的對象, 如下所示:
```
MyClass mc = new MyClass();
MyClass mc2 = mc;
```
接口必須與實現它的類對象一起初始化。如果 MyClass 實現 IMyInterface,則您創建了 IMyInterface 的實例,如下面的示例所示:
```
IMyInterface iface = new MyClass();
```
創建對象時,將在托管堆上分配內存,變量只保存對對象位置的引用。對于托管堆上的類型,在 CLR 的自動內存管理功能(稱為“垃圾回收”)對它們進行分配和回收時都需要系統開銷。但是,也對垃圾回收進行了高度優化,在大多數情況下它不會引起性能問題。有關垃圾回收的更多信息,請參見[自動內存管理](https://msdn.microsoft.com/zh-CN/library/f144e03t.aspx)。
所有數組都是引用類型,即使其元素是值類型也不例外。數組是從 [System.Array](https://msdn.microsoft.com/zh-CN/library/system.array.aspx) 類隱式派生的,但可以通過 C# 提供的簡化語法來聲明和使用它們,如下面的示例所示:
```
// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };
// Access an instance property of System.Array.
int len = nums.Length;
```
引用類型完全支持繼承。創建類時,可以從沒有定義為 [sealed](https://msdn.microsoft.com/zh-CN/library/88c54tsw.aspx) 的任何其他接口或類繼承,而其他類則可以從您創建的類繼承并重寫虛方法。有關如何創建自己的類的更多信息,請參見[類和結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx)。有關繼承和虛方法的更多信息,請參見[繼承(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173149.aspx)。
## 文本值類型
在 C# 中,文本值從編譯器接收類型。您可以通過在數字末尾追加一個字母來指定應如何類型化該數字文本。例如,若要指定應按浮點數來處理值 4.56,則在該數字后追加一個“f”或“F”:4.56f。如果沒有追加字母,則編譯器將為該文本推斷一個類型。有關可以使用字母后綴指定的類型的更多信息,請參見[值類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/s1ax56ch.aspx)中各個類型的參考頁。
由于文本已類型化,且所有類型最終都是從 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 派生,因此您可以編寫和編譯如下所示的代碼:
```
string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);
Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);
```
## 泛型類型
一個類型可以通過一個或多個類型參數聲明,而這些類型參數作為客戶端代碼在創建該類型的實例時提供的實際類型(具體類型)的占位符。這種類型稱為“泛型類型”。例如,.NET Framework 類型 [System.Collections.Generic.List<T>](https://msdn.microsoft.com/zh-CN/library/6sh2ey19.aspx) 有一個類型參數,按照約定該類型參數的名稱為 T。在創建該類型的實例時,會指定列表將包含的對象的類型,例如字符串:
```
List<string> strings = new List<string>();
```
使用類型參數便可以重復使用相同的類存放任意類型的元素,而不必將每個元素都轉換為[對象](https://msdn.microsoft.com/zh-CN/library/9kkx3h3c.aspx)。泛型集合類稱為“強類型集合”,因為編譯器知道集合中元素的特定類型,舉例來說,如果嘗試向上面示例中的 strings 對象添加整數,編譯器會在編譯時引發錯誤。有關詳細信息,請參閱 [泛型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/512aeb7t.aspx)。
## 隱式類型、匿名類型和可以為 null 的類型
如前面所述,您可以使用關鍵字 [var](https://msdn.microsoft.com/zh-CN/library/bb383973.aspx) 隱式類型化一個局部變量(非類成員)。該變量在編譯時仍然會接收一個類型,但該類型是由編譯器提供的。有關詳細信息,請參閱 [隱式類型的局部變量(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb384061.aspx)。
某些情況下為相關值的簡單集合創建命名類型是不方便的,因為這些相關值不準備在方法邊界外存儲或傳遞。可以創建匿名類型來實現此目的。有關更多信息,請參見[匿名類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb397696.aspx)。
普通的值類型不能有 [null](https://msdn.microsoft.com/zh-CN/library/edakx9da.aspx) 值。但是,可以通過在類型后面附加 **?** 來創建可以為 null 值的類型。例如,**int?** 是一個也可以具有 [null](https://msdn.microsoft.com/zh-CN/library/edakx9da.aspx) 值的 **int** 類型。在 CTS 中,可以為 null 的類型是泛型結構類型 [System.Nullable<T>](https://msdn.microsoft.com/zh-CN/library/b3h38hb0.aspx) 的實例。在向其數值可能為 null 的數據庫傳入數據和從中傳出數據時,可以為 null 的類型尤其有用。有關詳細信息,請參閱 [可以為 null 的類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/1t3y8s4s.aspx)。
## 相關章節
有關詳細信息,請參閱下列主題:
* [強制轉換和類型轉換(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173105.aspx)
* [裝箱和取消裝箱(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/yz2be5wk.aspx)
* [使用類型 dynamic(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/dd264736.aspx)
* [值類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/s1ax56ch.aspx)
* [引用類型(C# 參考)](https://msdn.microsoft.com/zh-CN/library/490f96s2.aspx)
* [類和結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx)
* [匿名類型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/bb397696.aspx)
* [泛型(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/512aeb7t.aspx)
* [Visual C# 2010 入門](http://go.microsoft.com/fwlink/?LinkId=221214) 中的[變量與表達式](http://go.microsoft.com/fwlink/?LinkId=221228)
## C# 語言規范
有關詳細信息,請參閱 [C# 語言規范](https://msdn.microsoft.com/zh-CN/library/ms228593.aspx)。該語言規范是 C# 語法和用法的權威資料。
## 請參閱
[C# 參考](https://msdn.microsoft.com/zh-CN/library/618ayhy6.aspx)
[C# 編程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx)
[XML 數據類型的轉換](https://msdn.microsoft.com/zh-CN/library/15st98za.aspx)
[整型表(C# 參考)](https://msdn.microsoft.com/zh-CN/library/exx3b86w.aspx)
- C# 編程指南
- 在 C# 程序內部
- Hello World -- 您的第一個程序(C# 編程指南)
- C# 程序的通用結構(C# 編程指南)
- C# 編碼約定(C# 編程指南)
- 數組(C# 編程指南)
- 作為對象的數組(C# 編程指南)
- 一維數組(C# 編程指南)
- 多維數組(C# 編程指南)
- 交錯數組(C# 編程指南)
- 對數組使用 foreach(C# 編程指南)
- 將數組作為參數傳遞(C# 編程指南)
- 使用 ref 和 out 傳遞數組(C# 編程指南)
- 隱式類型的數組(C# 編程指南)
- 類和結構(C# 編程指南)
- 類(C# 編程指南)
- 對象(C# 編程指南)
- 結構(C# 編程指南)
- 繼承(C# 編程指南)
- 多態性(C# 編程指南)
- 抽象類、密封類及類成員(C# 編程指南)
- 靜態類和靜態類成員(C# 編程指南)
- 成員(C# 編程指南)
- 訪問修飾符(C# 編程指南)
- 字段(C# 編程指南)
- 常量(C# 編程指南)
- 屬性(C# 編程指南)
- 方法(C# 編程指南)
- 構造函數(C# 編程指南)
- 析構函數(C# 編程指南)
- 對象和集合初始值設定項(C# 編程指南)
- 如何:使用 foreach 訪問集合類(C# 編程指南)
- 嵌套類型(C# 編程指南)
- 分部類和方法(C# 編程指南)
- 匿名類型(C# 編程指南)
- 委托(C# 編程指南)
- 使用委托(C# 編程指南)
- 帶有命名方法的委托與帶有匿名方法的委托(C# 編程指南)
- 如何:合并委托(多路廣播委托)(C# 編程指南)
- 如何:聲明、實例化和使用委托(C# 編程指南)
- 枚舉類型(C# 編程指南)
- 事件(C# 編程指南)
- 如何:訂閱和取消訂閱事件(C# 編程指南)
- 如何:發布符合 .NET Framework 準則的事件(C# 編程指南)
- 如何:在派生類中引發基類事件(C# 編程指南)
- 如何:實現接口事件(C# 編程指南)
- 如何:使用字典存儲事件實例(C# 編程指南)
- 如何:實現自定義事件訪問器(C# 編程指南)
- 異常和異常處理(C# 編程指南)
- 使用異常(C# 編程指南)
- 異常處理(C# 編程指南)
- 創建和引發異常(C# 編程指南)
- 編譯器生成的異常(C# 編程指南)
- 如何:使用 try/catch 處理異常(C# 編程指南)
- 如何:使用 finally 執行清理代碼(C# 編程指南)
- 如何:捕捉非 CLS 異常
- 文件系統和注冊表(C# 編程指南)
- 如何:循環訪問目錄樹(C# 編程指南)
- 如何:獲取有關文件、文件夾和驅動器的信息(C# 編程指南)
- 如何:創建文件或文件夾(C# 編程指南)
- 如何:復制、刪除和移動文件和文件夾(C# 編程指南)
- 如何:提供文件操作進度對話框(C# 編程指南)
- 如何:寫入文本文件(C# 編程指南)
- 如何:讀取文本文件中的內容(C# 編程指南)
- 如何:一次一行地讀取文本文件 (Visual C#)
- 如何:在注冊表中創建注冊表項 (Visual C#)
- 泛型(C# 編程指南)
- 泛型介紹(C# 編程指南)
- 泛型的優點(C# 編程指南)
- 泛型類型參數(C# 編程指南)
- 類型參數的約束(C# 編程指南)
- 泛型類(C# 編程指南)
- 泛型接口(C# 編程指南)
- 泛型方法(C# 編程指南)
- 泛型和數組(C# 編程指南)
- 泛型委托(C# 編程指南)
- 泛型代碼中的默認關鍵字(C# 編程指南)
- C++ 模板和 C# 泛型之間的區別(C# 編程指南)
- 運行時中的泛型(C# 編程指南)
- .NET Framework 類庫中的泛型(C# 編程指南)
- 泛型和反射(C# 編程指南)
- 泛型和特性(C# 編程指南)
- 索引器(C# 編程指南)
- 使用索引器(C# 編程指南)
- 接口中的索引器(C# 編程指南)
- 屬性和索引器之間的比較(C# 編程指南)
- 接口(C# 編程指南)
- 顯式接口實現(C# 編程指南)
- 如何:顯式實現接口成員(C# 編程指南)
- 如何:顯式實現兩個接口的成員(C# 編程指南)
- 互操作性(C# 編程指南)
- 互操作性概述(C# 編程指南)
- 如何:通過使用 Visual C# 功能訪問 Office 互操作對象(C# 編程指南)
- 如何:在 COM 互操作編程中使用索引屬性(C# 編程指南)
- 如何:使用平臺調用播放波形文件(C# 編程指南)
- 演練:Office 編程(C# 和 Visual Basic)
- COM 類示例(C# 編程指南)
- LINQ 查詢表達式(C# 編程指南)
- 查詢表達式基礎(C# 編程指南)
- 如何:在 C# 中編寫 LINQ 查詢
- 如何:查詢對象集合(C# 編程指南)
- 如何:從方法中返回查詢(C# 編程指南)
- 如何:在內存中存儲查詢結果(C# 編程指南)
- 如何:對查詢結果進行分組(C# 編程指南)
- 如何:創建嵌套組(C# 編程指南)
- 如何:對分組操作執行子查詢(C# 編程指南)
- 如何:按連續鍵對結果進行分組(C# 編程指南)
- 如何:在運行時動態指定謂詞篩選器(C# 編程指南)
- 如何:執行內部聯接(C# 編程指南)
- 如何:執行分組聯接(C# 編程指南)
- 如何:執行左外部聯接(C# 編程指南)
- 如何:對 Join 子句的結果進行排序(C# 編程指南)
- 如何:使用復合鍵進行聯接(C# 編程指南)
- 如何:執行自定義聯接操作(C# 編程指南)
- 如何:在查詢表達式中處理 Null 值(C# 編程指南)
- 如何:在查詢表達式中處理異常(C# 編程指南)
- Main() 和命令行參數(C# 編程指南)
- 命令行參數(C# 編程指南)
- 如何:顯示命令行參數(C# 編程指南)
- 如何:使用 foreach 訪問命令行參數(C# 編程指南)
- Main() 返回值(C# 編程指南)
- 命名空間(C# 編程指南)
- 使用命名空間(C# 編程指南)
- 如何:使用全局命名空間別名(C# 編程指南)
- 如何:使用 My 命名空間(C# 編程指南)
- 可以為 null 的類型(C# 編程指南)
- 使用可以為 null 的類型(C# 編程指南)
- 裝箱可以為 null 的類型(C# 編程指南)
- 如何:標識可以為 null 的類型(C# 編程指南)
- 如何:安全地將 bool? 強制轉換為 bool(C# 編程指南)
- 語句、表達式和運算符(C# 編程指南)
- 語句(C# 編程指南)
- 表達式(C# 編程指南)
- 運算符(C# 編程指南)
- 匿名函數(C# 編程指南)
- 可重載運算符(C# 編程指南)
- 轉換運算符(C# 編程指南)
- 如何:使用運算符重載創建復數類(C# 編程指南)
- 相等比較(C# 編程指南)
- 字符串(C# 編程指南)
- 如何:串聯多個字符串(C# 編程指南)
- 如何:修改字符串內容(C# 編程指南)
- 如何:比較字符串(C# 編程指南)
- 如何:拆分字符串(C# 編程指南)
- 如何:使用字符串方法搜索字符串(C# 編程指南)
- 如何:使用正則表達式搜索字符串(C# 編程指南)
- 如何:確定字符串是否表示數值(C# 編程指南)
- 如何:將字符串轉換為 DateTime(C# 編程指南)
- 如何:在舊式編碼與 Unicode 之間轉換(C# 編程指南)
- 如何:將 RTF 轉換為純文本(C# 編程指南)
- 類型(C# 編程指南)
- 強制轉換和類型轉換(C# 編程指南)
- 裝箱和取消裝箱(C# 編程指南)
- 使用類型 dynamic(C# 編程指南)
- 如何:使用 as 和 is 運算符安全地進行強制轉換(C# 編程指南)
- 如何:將字節數組轉換為 int(C# 編程指南)
- 如何:將字符串轉換為數字(C# 編程指南)
- 如何:在十六進制字符串與數值類型之間轉換(C# 編程指南)
- 不安全代碼和指針(C# 編程指南)
- 固定大小的緩沖區(C# 編程指南)
- 指針類型(C# 編程指南)
- XML 文檔注釋(C# 編程指南)
- 建議的文檔注釋標記(C# 編程指南)
- 處理 XML 文件(C# 編程指南)
- 文檔標記的分隔符(C# 編程指南)
- 如何:使用 XML 文檔功能(C# 編程指南)
- C# 參考
- C# 關鍵字
- 類型(C# 參考)
- 值類型(C# 參考)
- bool(C# 參考)
- byte(C# 參考)
- char(C# 參考)
- decimal(C# 參考)
- double(C# 參考)
- enum(C# 參考)
- float(C# 參考)
- int(C# 參考)
- long(C# 參考)
- sbyte(C# 參考)
- short(C# 參考)
- struct(C# 參考)
- uint(C# 參考)
- ulong(C# 參考)
- ushort(C# 參考)
- 引用類型(C# 參考)
- class(C# 參考)
- 委托(C# 參考)
- dynamic(C# 參考)
- 接口(C# 參考)
- object(C# 參考)
- string(C# 參考)
- 內插字符串(C# 和 Visual Basic 引用)
- void(C# 參考)
- var(C# 參考)
- 類型參考表(C# 參考)
- 內置類型表(C# 參考)
- 整型表(C# 參考)
- 浮點型表(C# 參考)
- 默認值表(C# 參考)
- 值類型表(C# 參考)
- 隱式數值轉換表(C# 參考)
- 顯式數值轉換表(C# 參考)
- 設置數值結果表的格式(C# 參考)
- 修飾符(C# 參考)
- 訪問修飾符(C# 參考)
- 可訪問性級別(C# 參考)
- 可訪問域(C# 參考)
- 可訪問性級別的使用限制(C# 參考)
- internal(C# 參考)
- private(C# 參考)
- protected(C# 參考)
- public(C# 參考)
- abstract(C# 參考)
- async(C# 參考)
- const(C# 參考)
- event(C# 參考)
- extern(C# 參考)
- in(泛型修飾符)(C# 參考)
- out(泛型修飾符)(C# 參考)
- override(C# 參考)
- readonly(C# 參考)
- sealed(C# 參考)
- static(C# 參考)
- unsafe(C# 參考)
- virtual(C# 參考)
- volatile(C# 參考)
- 語句關鍵字(C# 參考)
- 選擇語句(C# 參考)
- if-else(C# 參考)
- switch(C# 參考)
- 迭代語句(C# 參考)
- do(C# 參考)
- for(C# 參考)
- foreach,in(C# 參考)
- while(C# 參考)
- 跳轉語句(C# 參考)
- break(C# 參考)
- continue(C# 參考)
- goto(C# 參考)
- return(C# 參考)
- 異常處理語句(C# 參考)
- throw(C# 參考)
- try-catch(C# 參考)
- try-finally(C# 參考)
- try-catch-finally(C# 參考)
- Checked 和 Unchecked(C# 參考)
- checked(C# 參考)
- unchecked(C# 參考)
- fixed 語句(C# 參考)
- “鎖定”語句(C# 參考)
- 方法參數(C# 參考)
- params(C# 參考)
- ref(C# 參考)
- out(C# 參考)
- out 參數修飾符(C# 參考)
- 命名空間關鍵字(C# 參考)
- 命名空間(C# 參考)
- using(C# 參考)
- using 指令(C# 參考)
- using 語句(C# 參考)
- 外部別名(C# 參考)
- 運算符關鍵字(C# 參考)
- as(C# 參考)
- await(C# 參考)
- is(C# 參考)
- new(C# 參考)
- new 運算符(C# 參考)
- new 修飾符(C# 參考)
- new 約束(C# 參考)
- sizeof(C# 參考)
- typeof(C# 參考)
- true(C# 參考)
- true 運算符(C# 參考)
- true 字面常數(C# 參考)
- false(C# 參考)
- false 運算符(C# 參考)
- false 字面常數(C# 參考)
- stackalloc(C# 參考)
- nameof(C# 和 Visual Basic 引用)
- 轉換關鍵字(C# 參考)
- explicit(C# 參考)
- implicit(C# 參考)
- 運算符(C# 參考)
- 訪問關鍵字(C# 參考)
- base(C# 參考)
- this(C# 參考)
- 文字關鍵字(C# 參考)
- null(C# 參考)
- default(C# 參考)
- 上下文關鍵字(C# 參考)
- add(C# 參考)
- get(C# 參考)
- global(C# 參考)
- 分部(類型)(C# 參考)
- 分部(方法)(C# 參考)
- remove(C# 參考)
- set(C# 參考)
- where(泛型類型約束)(C# 參考)
- value(C# 參考)
- yield(C# 參考)
- 查詢關鍵字(C# 參考)
- from 子句(C# 參考)
- where 子句(C# 參考)
- select 子句(C# 參考)
- group 子句(C# 參考)
- into(C# 參考)
- orderby 子句(C# 參考)
- join 子句(C# 參考)
- let 子句(C# 參考)
- ascending(C# 參考)
- descending(C# 參考)
- on(C# 參考)
- equals(C# 參考)
- by(C# 參考)
- in(C# 參考)
- C# 運算符
- 運算符(C# 參考)
- () 運算符(C# 參考)
- . 運算符(C# 參考)
- :: 運算符(C# 參考)
- + 運算符(C# 參考)
- - 運算符(C# 參考)
- * 運算符(C# 參考)
- / 運算符(C# 參考)
- % 運算符(C# 參考)
- & 運算符(C# 參考)
- | 運算符(C# 參考)
- ^ 運算符(C# 參考)
- ! 運算符(C# 參考)
- ~ 運算符(C# 參考)
- = 運算符(C# 參考)
- &lt; 運算符(C# 參考)
- &gt; 運算符(C# 參考)
- ?: 運算符(C# 參考)
- ++ 運算符(C# 參考)
- -- 運算符(C# 參考)
- && 運算符(C# 參考)
- || 運算符(C# 參考)
- &lt;&lt; 運算符(C# 參考)
- &gt;&gt; 運算符(C# 參考)
- == 運算符(C# 參考)
- != 運算符(C# 參考)
- &lt;= 運算符(C# 參考)
- &gt;= 運算符(C# 參考)
- += 運算符(C# 參考)
- -= 運算符(C# 參考)
- *= 運算符(C# 參考)
- /= 運算符(C# 參考)
- %= 運算符(C# 參考)
- &= 運算符(C# 參考)
- |= 運算符(C# 參考)
- ^= 運算符(C# 參考)
- &lt;&lt;= 運算符(C# 參考)
- &gt;&gt;= 運算符(C# 參考)
- -&gt; 運算符(C# 參考)
- ?? 運算符(C# 參考)
- =&gt; 運算符(C# 參考)
- NULL 條件運算符(C# 和 Visual Basic)
- C# 預處理器指令
- #if(C# 參考)
- #else(C# 參考)
- #elif(C# 參考)
- #endif(C# 參考)
- #define(C# 參考)
- #undef(C# 參考)
- #warning(C# 參考)
- #error(C# 參考)
- #line(C# 參考)
- #region(C# 參考)
- #endregion(C# 參考)
- #pragma(C# 參考)
- #pragma warning(C# 參考)
- #pragma checksum(C# 參考)
- C# Compiler Options
- Command-line Building With csc.exe
- How to: Set Environment Variables for the Visual Studio Command Line
- Deployment of C# Applications
- C# Compiler Options Listed by Category
- C# Compiler Options Listed Alphabetically
- @ (C# Compiler Options)
- /addmodule (C# Compiler Options)
- /appconfig (C# Compiler Options)
- /baseaddress (C# Compiler Options)
- /bugreport (C# Compiler Options)
- /checked (C# Compiler Options)
- /codepage (C# Compiler Options)
- /debug (C# Compiler Options)
- /define (C# Compiler Options)
- /delaysign (C# Compiler Options)
- /doc (C# Compiler Options)
- /errorreport (C# Compiler Options)
- /filealign (C# Compiler Options)
- /fullpaths (C# Compiler Options)
- /help, /? (C# Compiler Options)
- /highentropyva (C# Compiler Options)
- /keycontainer (C# Compiler Options)
- /keyfile (C# Compiler Options)
- /langversion (C# Compiler Options)
- /lib (C# Compiler Options)
- /link (C# Compiler Options)
- /linkresource (C# Compiler Options)
- /main (C# Compiler Options)
- /moduleassemblyname (C# Compiler Option)
- /noconfig (C# Compiler Options)
- /nologo (C# Compiler Options)
- /nostdlib (C# Compiler Options)
- /nowarn (C# Compiler Options)
- /nowin32manifest (C# Compiler Options)
- /optimize (C# Compiler Options)
- /out (C# Compiler Options)
- /pdb (C# Compiler Options)
- /platform (C# Compiler Options)
- /preferreduilang (C# Compiler Options)
- /recurse (C# Compiler Options)
- /reference (C# Compiler Options)
- /resource (C# Compiler Options)
- /subsystemversion (C# Compiler Options)
- /target (C# Compiler Options)
- /target:appcontainerexe(C# 編譯器選項)
- /target:exe (C# Compiler Options)
- /target:library (C# Compiler Options)
- /target:module (C# Compiler Options)
- /target:winexe (C# Compiler Options)
- /target:winmdobj(C# 編譯器選項)
- /unsafe (C# Compiler Options)
- /utf8output (C# Compiler Options)
- /warn (C# Compiler Options)
- /warnaserror (C# Compiler Options)
- /win32icon (C# Compiler Options)
- /win32manifest (C# Compiler Options)
- /win32res (C# Compiler Options)
- C# Compiler Errors
- Compiler Error CS0001
- Compiler Error CS0006
- Compiler Error CS0007
- 編譯器錯誤 CS0015
- Compiler Error CS0016
- Compiler Error CS0019
- Compiler Error CS0029
- Compiler Error CS0034
- Compiler Error CS0038
- Compiler Error CS0039
- Compiler Error CS0050
- Compiler Error CS0051
- Compiler Error CS0052
- Compiler Error CS0071
- Compiler Error CS0103
- Compiler Error CS0106
- Compiler Error CS0115
- Compiler Error CS0116
- Compiler Error CS0120
- Compiler Error CS0122
- Compiler Error CS0134
- Compiler Error CS0151
- 編譯器錯誤 CS0163
- Compiler Error CS0165
- Compiler Error CS0173
- Compiler Error CS0178
- Compiler Error CS0188
- Compiler Error CS0201
- Compiler Error CS0229
- Compiler Error CS0233
- Compiler Error CS0234
- Compiler Error CS0246
- Compiler Error CS0260
- Compiler Error CS0266
- Compiler Error CS0269
- Compiler Error CS0270
- Compiler Error CS0304
- Compiler Error CS0310
- Compiler Error CS0311
- Compiler Error CS0413
- Compiler Error CS0417
- Compiler Error CS0433
- Compiler Error CS0445
- Compiler Error CS0446
- Compiler Error CS0504
- 編譯器錯誤 CS0507
- Compiler Error CS0518
- Compiler Error CS0523
- Compiler Error CS0545
- Compiler Error CS0552
- Compiler Error CS0563
- Compiler Error CS0570
- Compiler Error CS0571
- Compiler Error CS0579
- Compiler Error CS0592
- Compiler Error CS0616
- Compiler Error CS0650
- Compiler Error CS0686
- Compiler Error CS0702
- 編譯器錯誤 CS0703
- Compiler Error CS0731
- Compiler Error CS0826
- Compiler Error CS0834
- Compiler Error CS0840
- 編譯器錯誤 CS0843
- Compiler Error CS0845
- Compiler Error CS1001
- Compiler Error CS1009
- Compiler Error CS1018
- Compiler Error CS1019
- Compiler Error CS1026
- Compiler Error CS1029
- Compiler Error CS1061
- Compiler Error CS1112
- 編譯器錯誤 CS1501
- Compiler Error CS1502
- Compiler Error CS1519
- Compiler Error CS1540
- Compiler Error CS1546
- Compiler Error CS1548
- Compiler Error CS1564
- Compiler Error CS1567
- Compiler Error CS1579
- Compiler Error CS1612
- Compiler Error CS1614
- Compiler Error CS1640
- Compiler Error CS1644
- Compiler Error CS1656
- Compiler Error CS1674
- Compiler Error CS1703
- Compiler Error CS1704
- Compiler Error CS1705
- Compiler Error CS1708
- Compiler Error CS1716
- 編譯器錯誤 CS1721
- Compiler Error CS1726
- Compiler Error CS1729
- Compiler Error CS1919
- Compiler Error CS1921
- Compiler Error CS1926
- Compiler Error CS1933
- Compiler Error CS1936
- Compiler Error CS1941
- Compiler Error CS1942
- Compiler Error CS1943
- Compiler Error CS1946
- 編譯器錯誤 CS2032
- Compiler Warning (level 1) CS0420
- Compiler Warning (level 1) CS0465
- Compiler Warning (level 1) CS1058
- Compiler Warning (level 1) CS1060
- Compiler Warning (level 1) CS1598
- Compiler Warning (level 1) CS1607
- Compiler Warning (level 1) CS1616
- Compiler Warning (level 1) CS1658
- Compiler Warning (level 1) CS1683
- Compiler Warning (level 1) CS1685
- Compiler Warning (level 1) CS1690
- Compiler Warning (level 1) CS1691
- Compiler Warning (level 1) CS1699
- Compiler Warning (level 1) CS1762
- Compiler Warning (level 1) CS1956
- Compiler Warning (level 1) CS3003
- Compiler Warning (level 1) CS3007
- Compiler Warning (level 1) CS3009
- 編譯器警告(等級 1)CS4014
- Compiler Warning (level 2) CS0108
- 編譯器警告(等級 2)CS0467
- Compiler Warning (level 2) CS0618
- Compiler Warning (level 2) CS1701
- Compiler Warning (level 3) CS0675
- Compiler Warning (level 3) CS1700
- Compiler Warning (level 4) CS0429
- Compiler Warning (level 4) CS1591
- Compiler Warning (level 4) CS1610
- C# 語言規范