# join 子句(C# 參考)
使用 **join** 子句可以將來自不同源序列并且在對象模型中沒有直接關系的元素相關聯。唯一的要求是每個源中的元素需要共享某個可以進行比較以判斷是否相等的值。例如,食品經銷商可能具有某種產品的供應商列表以及買主列表。例如,可以使用 **join** 子句創建該產品同一指定地區供應商和買主的列表。
**join** 子句接受兩個源序列作為輸入。每個序列中的元素都必須是可以與另一個序列中的相應屬性進行比較的屬性,或者包含一個這樣的屬性。 **join** 子句使用特殊的 **equals** 關鍵字比較指定的鍵是否相等。 **join** 子句執行的所有聯接都是同等聯接。 **join** 子句的輸出形式取決于所執行的聯接的具體類型。以下是三種最常見的聯接類型:
* 內部聯接
* 分組聯接
* 左外部聯接
## 內部聯接
下面的示例演示一個簡單的內部同等聯接。此查詢產生一個“產品名稱/類別”對平面序列。同一類別字符串將出現在多個元素中。如果 categories 中的某個元素不具有匹配的 products,則該類別不會出現在結果中。
```
var innerJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID
select new { ProductName = prod.Name, Category = category.Name }; //produces flat sequence
```
有關更多信息,請參見 [如何:執行內部聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397941.aspx)。
## Group Join
含有 **into** 表達式的 **join** 子句稱為分組聯接。
```
var innerGroupJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
select new { CategoryName = category.Name, Products = prodGroup };
```
分組聯接會產生一個分層的結果序列,該序列將左側源序列中的元素與右側源序列中的一個或多個匹配元素相關聯。分組聯接沒有等效的關系術語;它本質上是一個對象數組序列。
如果在右側源序列中找不到與左側源中的元素相匹配的元素,則 **join** 子句會為該項產生一個空數組。因此,分組聯接基本上仍然是一種內部同等聯接,區別只在于分組聯接將結果序列組織為多個組。
如果您只選擇分組聯接的結果,則可以訪問各個項,但無法識別結果所匹配的鍵。因此,通常更為有用的做法是選擇分組聯接的結果并放入一個也具有該鍵名的新類型中,如上一個示例所示。
當然,還可以將分組聯接的結果用作其他子查詢的生成器:
```
var innerGroupJoinQuery2 =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
from prod2 in prodGroup
where prod2.UnitPrice > 2.50M
select prod2;
```
有關更多信息,請參見 [如何:執行分組聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397905.aspx)。
## 左外部聯接
在左外部聯接中,將返回左側源序列中的所有元素,即使它們在右側序列中沒有匹配的元素也是如此。若要在 LINQ 中執行左外部聯接,請將 **DefaultIfEmpty** 方法與分組聯接結合起來,以指定要在某個左側元素不具有匹配元素時產生的默認右側元素。可以使用 **null** 作為任何引用類型的默認值,也可以指定用戶定義的默認類型。下面的示例演示了用戶定義的默認類型:
```
var leftOuterJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
from item in prodGroup.DefaultIfEmpty(new Product { Name = String.Empty, CategoryID = 0 })
select new { CatName = category.Name, ProdName = item.Name };
```
有關更多信息,請參見 [如何:執行左外部聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397895.aspx)。
## equals 運算符
**join** 子句執行同等聯接。換句話說,只能基于兩個鍵之間的相等關系進行匹配。其他類型的比較(例如,“greater than”或“not equals”)不受支持。為了表明所有聯接都是同等聯接,**join** 子句使用 **equals** 關鍵字而不是 **==** 運算符。 **equals** 關鍵字只能用在 **join** 子句中,并且它與 **==** 運算符之間存在一個重要區別。對于 **equals**,左鍵使用外部源序列,而右鍵使用內部源序列。外部源僅在 **equals** 的左側位于范圍內,而內部源序列僅在其右側位于范圍內。
## 非同等聯接
通過使用多個 **from** 子句將新序列單獨引入到查詢中,可以執行非同等聯接、交叉聯接和其他自定義聯接操作。有關更多信息,請參見 [如何:執行自定義聯接操作(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb882533.aspx)。
## 對象集合聯接與關系表
在 LINQ 查詢表達式中,聯接操作是在對象集合上執行的。不能使用與兩個關系表完全相同的方式“聯接”對象集合。在 LINQ 中,僅當兩個源序列沒有通過任何關系相互聯系時,才需要使用顯式 **join** 子句。使用 LINQ to SQL 時,外鍵表在對象模型中表示為主表的屬性。例如,在 Northwind 數據庫中,Customer 表與 Orders 表之間具有外鍵關系。在將這兩個表映射到對象模型時,Customer 類具有一個 Orders 屬性,該屬性包含與該 Customer 相關聯的 Orders 的集合。實際上,已經為您執行了聯接。
有關在 LINQ to SQL 的上下文中跨相關表執行查詢的更多信息,請參見[如何:映射數據庫關系](https://msdn.microsoft.com/zh-cn/library/bb386950.aspx)。
## 復合鍵
使用復合鍵可以測試多個值是否相等。有關更多信息,請參見 [如何:使用復合鍵進行聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb907099.aspx)。還可以在 **group** 子句中使用組合鍵。
下面的示例比較了使用相同的匹配鍵對相同數據源執行內部聯接、分組聯接和左外部聯接的結果。這些示例中添加了一些額外的代碼,以便在控制臺顯示中闡明結果。
```
class JoinDemonstration
{
#region Data
class Product
{
public string Name { get; set; }
public int CategoryID { get; set; }
}
class Category
{
public string Name { get; set; }
public int ID { get; set; }
}
// Specify the first data source.
List<Category> categories = new List<Category>()
{
new Category(){Name="Beverages", ID=001},
new Category(){ Name="Condiments", ID=002},
new Category(){ Name="Vegetables", ID=003},
new Category() { Name="Grains", ID=004},
new Category() { Name="Fruit", ID=005}
};
// Specify the second data source.
List<Product> products = new List<Product>()
{
new Product{Name="Cola", CategoryID=001},
new Product{Name="Tea", CategoryID=001},
new Product{Name="Mustard", CategoryID=002},
new Product{Name="Pickles", CategoryID=002},
new Product{Name="Carrots", CategoryID=003},
new Product{Name="Bok Choy", CategoryID=003},
new Product{Name="Peaches", CategoryID=005},
new Product{Name="Melons", CategoryID=005},
};
#endregion
static void Main(string[] args)
{
JoinDemonstration app = new JoinDemonstration();
app.InnerJoin();
app.GroupJoin();
app.GroupInnerJoin();
app.GroupJoin3();
app.LeftOuterJoin();
app.LeftOuterJoin2();
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
void InnerJoin()
{
// Create the query that selects
// a property from each element.
var innerJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID
select new { Category = category.ID, Product = prod.Name };
Console.WriteLine("InnerJoin:");
// Execute the query. Access results
// with a simple foreach statement.
foreach (var item in innerJoinQuery)
{
Console.WriteLine("{0,-10}{1}", item.Product, item.Category);
}
Console.WriteLine("InnerJoin: {0} items in 1 group.", innerJoinQuery.Count());
Console.WriteLine(System.Environment.NewLine);
}
void GroupJoin()
{
// This is a demonstration query to show the output
// of a "raw" group join. A more typical group join
// is shown in the GroupInnerJoin method.
var groupJoinQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
select prodGroup;
// Store the count of total items (for demonstration only).
int totalItems = 0;
Console.WriteLine("Simple GroupJoin:");
// A nested foreach statement is required to access group items.
foreach (var prodGrouping in groupJoinQuery)
{
Console.WriteLine("Group:");
foreach (var item in prodGrouping)
{
totalItems++;
Console.WriteLine(" {0,-10}{1}", item.Name, item.CategoryID);
}
}
Console.WriteLine("Unshaped GroupJoin: {0} items in {1} unnamed groups", totalItems, groupJoinQuery.Count());
Console.WriteLine(System.Environment.NewLine);
}
void GroupInnerJoin()
{
var groupJoinQuery2 =
from category in categories
orderby category.ID
join prod in products on category.ID equals prod.CategoryID into prodGroup
select new
{
Category = category.Name,
Products = from prod2 in prodGroup
orderby prod2.Name
select prod2
};
//Console.WriteLine("GroupInnerJoin:");
int totalItems = 0;
Console.WriteLine("GroupInnerJoin:");
foreach (var productGroup in groupJoinQuery2)
{
Console.WriteLine(productGroup.Category);
foreach (var prodItem in productGroup.Products)
{
totalItems++;
Console.WriteLine(" {0,-10} {1}", prodItem.Name, prodItem.CategoryID);
}
}
Console.WriteLine("GroupInnerJoin: {0} items in {1} named groups", totalItems, groupJoinQuery2.Count());
Console.WriteLine(System.Environment.NewLine);
}
void GroupJoin3()
{
var groupJoinQuery3 =
from category in categories
join product in products on category.ID equals product.CategoryID into prodGroup
from prod in prodGroup
orderby prod.CategoryID
select new { Category = prod.CategoryID, ProductName = prod.Name };
//Console.WriteLine("GroupInnerJoin:");
int totalItems = 0;
Console.WriteLine("GroupJoin3:");
foreach (var item in groupJoinQuery3)
{
totalItems++;
Console.WriteLine(" {0}:{1}", item.ProductName, item.Category);
}
Console.WriteLine("GroupJoin3: {0} items in 1 group", totalItems, groupJoinQuery3.Count());
Console.WriteLine(System.Environment.NewLine);
}
void LeftOuterJoin()
{
// Create the query.
var leftOuterQuery =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
select prodGroup.DefaultIfEmpty(new Product() { Name = "Nothing!", CategoryID = category.ID });
// Store the count of total items (for demonstration only).
int totalItems = 0;
Console.WriteLine("Left Outer Join:");
// A nested foreach statement is required to access group items
foreach (var prodGrouping in leftOuterQuery)
{
Console.WriteLine("Group:", prodGrouping.Count());
foreach (var item in prodGrouping)
{
totalItems++;
Console.WriteLine(" {0,-10}{1}", item.Name, item.CategoryID);
}
}
Console.WriteLine("LeftOuterJoin: {0} items in {1} groups", totalItems, leftOuterQuery.Count());
Console.WriteLine(System.Environment.NewLine);
}
void LeftOuterJoin2()
{
// Create the query.
var leftOuterQuery2 =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
from item in prodGroup.DefaultIfEmpty()
select new { Name = item == null ? "Nothing!" : item.Name, CategoryID = category.ID };
Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", leftOuterQuery2.Count());
// Store the count of total items
int totalItems = 0;
Console.WriteLine("Left Outer Join 2:");
// Groups have been flattened.
foreach (var item in leftOuterQuery2)
{
totalItems++;
Console.WriteLine("{0,-10}{1}", item.Name, item.CategoryID);
}
Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", totalItems);
}
}
/*Output:
InnerJoin:
Cola 1
Tea 1
Mustard 2
Pickles 2
Carrots 3
Bok Choy 3
Peaches 5
Melons 5
InnerJoin: 8 items in 1 group.
Unshaped GroupJoin:
Group:
Cola 1
Tea 1
Group:
Mustard 2
Pickles 2
Group:
Carrots 3
Bok Choy 3
Group:
Group:
Peaches 5
Melons 5
Unshaped GroupJoin: 8 items in 5 unnamed groups
GroupInnerJoin:
Beverages
Cola 1
Tea 1
Condiments
Mustard 2
Pickles 2
Vegetables
Bok Choy 3
Carrots 3
Grains
Fruit
Melons 5
Peaches 5
GroupInnerJoin: 8 items in 5 named groups
GroupJoin3:
Cola:1
Tea:1
Mustard:2
Pickles:2
Carrots:3
Bok Choy:3
Peaches:5
Melons:5
GroupJoin3: 8 items in 1 group
Left Outer Join:
Group:
Cola 1
Tea 1
Group:
Mustard 2
Pickles 2
Group:
Carrots 3
Bok Choy 3
Group:
Nothing! 4
Group:
Peaches 5
Melons 5
LeftOuterJoin: 9 items in 5 groups
LeftOuterJoin2: 9 items in 1 group
Left Outer Join 2:
Cola 1
Tea 1
Mustard 2
Pickles 2
Carrots 3
Bok Choy 3
Nothing! 4
Peaches 5
Melons 5
LeftOuterJoin2: 9 items in 1 group
Press any key to exit.
*/
```
## 備注
后面未跟 **into** 的 **join** 子句被轉換為 [Join<TOuter, TInner, TKey, TResult>](https://msdn.microsoft.com/zh-cn/library/bb534675.aspx) 方法調用;后面跟有 **into** 的 **join** 子句被轉換為 [GroupJoin<TOuter, TInner, TKey, TResult>](https://msdn.microsoft.com/zh-cn/library/bb534297.aspx) 方法調用。
## 請參閱
[查詢關鍵字(C# 參考)](https://msdn.microsoft.com/zh-cn/library/bb310804.aspx)
[LINQ 查詢表達式(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397676.aspx)
[Join Operations](https://msdn.microsoft.com/zh-cn/library/bb397908.aspx)
[group 子句(C# 參考)](https://msdn.microsoft.com/zh-cn/library/bb384063.aspx)
[如何:執行左外部聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397895.aspx)
[如何:執行內部聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397941.aspx)
[如何:執行分組聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb397905.aspx)
[如何:對 Join 子句的結果進行排序(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb882517.aspx)
[如何:使用復合鍵進行聯接(C# 編程指南)](https://msdn.microsoft.com/zh-cn/library/bb907099.aspx)
[如何:安裝示例數據庫](https://msdn.microsoft.com/zh-cn/library/8b6y4c7s.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# 語言規范