C Sharp语法

C Sharp是编写该语言程序的一套规则。也适用于.NET Framework and Mono。
C# 2.0的特性.
针对于.NET SDK 2.0（相对应于ECMA-334标准第三版），C# 的新特性有：
分部类别.
分部类别将类别的实现分在多个文件中。该概念于C# 中首次出现，除了能将一个类别的成员分开存放，还使ASP.NET中的代码后置得以实现。代码后置实现了HTML代码和后台交互代码的分离。
file1.cs:
<syntaxhighlight lang="csharp">
public partial class MyClass1
</syntaxhighlight>
file2.cs:
<syntaxhighlight lang="csharp">
public partial class MyClass1
</syntaxhighlight>
分部类别这个特性允许将一个类别的编写工作分配给多个人，一人写一个文件，便于版本控制。它又可以隔离自动生成的代码和人工书写的代码，例如设计窗体应用程序时。
泛型.
泛型，或参数化类型，是被C#支持的.NET 2.0特性。不同于C++模版，.NET参数化类型是在运行时被实例化，而不是编译时，因此它可以跨语言，而C++模版却不行。C#泛型类在编译时，先生成中间代码IL，通用类型符号T只是一个占位符；在实例化类时，根据实际数据类型代替T并由即时编译器（JIT）生成本地代码，其中使用了实际的数据类型，等同于用实际类型写的普通的类。
它支持的一些特性并不被C++模版直接支持，比如约束泛型参数实现一个接口。另一方面，C# 不支持无类型的泛型参数。不像Java中的泛型，在CLI虚拟机中，.NET generics使用具化生成泛型参数，它允许优化和保存类型信息。
泛型类中，可以用where关键字对参数类型实现约束。例如：
<syntaxhighlight lang="csharp">
</syntaxhighlight>
上述表示T和V必须是Stack类或其派生类，T必须继承了IComparable接口、有无参构造函数、是引用类型；V必须是值类型。
泛型不仅能作用在类上，也可单独用在类的方法上，称为“泛型方法”。
泛型类的静态成员变量在相同封闭类间共享，不同的封闭类间不共享。
泛型类中的方法重载，参数类型T和V在运行时确定，不影响这个类通过编译。C#的泛型是在实例的方法被调用时检查重载是否产生混淆，而不是在泛型类本身编译时检查。特别地，当一般方法与泛型方法具有相同的签名时，会覆盖泛型方法。
静态类别.
静态类别它不能被实例化，并且只能有静态成员。这同很多过程语言中的模块概念相类似。
迭代器.
一种新形式的迭代器它提供了函数式编程中的generator，使用codice_1
类似于Python中使用的codice_2
<syntaxhighlight lang="csharp">
// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
</syntaxhighlight>
注意事项：
匿名方法.
匿名方法类似于函数式编程中的闭包。匿名方法是通过使用 delegate 关键字创建委托实例来声明的。例如：
<syntaxhighlight lang="csharp">
delegate void NumberChanger(int n);
NumberChanger nc = delegate(int x)
public void Foo(object parameter)
</syntaxhighlight>
委托的协变和逆变.
委托签名的协变和逆变,
属性访问器可以被单独设置访问级别.
例子：
<syntaxhighlight lang="csharp">
string status = string.Empty;
public string Status
</syntaxhighlight>
可空类型.
可空类型（跟个问号，如codice_3）允许设置codice_4给任何类类型。
<syntaxhighlight lang="csharp">
int? i = null;
object o = i;
if(o == null)
else
</syntaxhighlight>
??运算子.
（codice_5）：如果左运算数表达式的值不为空值时回传该值，如果为空值则返回右运算数表达式的值。
<syntaxhighlight lang="csharp">
object nullObj = null; 
object obj = new Object(); 
return nullObj ?? obj; // returns obj
</syntaxhighlight>
主要用作将一个可空类型赋值给不可空类型的简便语法
<syntaxhighlight lang="csharp">
int? i = null;
int j = i ?? 0; // Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.
</syntaxhighlight>
C# 3.0的特性.
C# 3.0发布于2007年10月17日，是.NET Framework 3.5的一部分，它的新特性灵感来自于函数式编程语言，如：Haskell和ML，并广泛地引入了Language Integrated Query（LINQ）模式到通用语言运行库中e.
Linq.
语言集成查询（Language Integrated Query，缩写：LINQ）： 上下文相关关键字"codice_6, codice_7, codice_8"可用于查询SQL、XML、集合等。这些标识符在LINQ上下文中被作为关键字，但是它们的增加不会破坏原有的名为codice_6、codice_7或codice_8的变量。
类型初始化器.
<syntaxhighlight lang="csharp">
Customer c = new Customer();
c.Name = "James";
</syntaxhighlight>
可写作：
<syntaxhighlight lang="csharp">
Customer c = new Customer() { Name="James" };
</syntaxhighlight>
集合初始化器.
<syntaxhighlight lang="csharp">MyList list = new MyList();
list.Add(1);
list.Add(2);</syntaxhighlight>
可写作
<syntaxhighlight lang="csharp">MyList list = new MyList { 1, 2 };</syntaxhighlight>
假设codice_12实现了codice_13且有一个codice_14方法method
匿名类型.
<syntaxhighlight lang="csharp">var x = new { Name="James" };</syntaxhighlight>
局部变量类型推断.
局部变量类型推断：<syntaxhighlight lang="csharp">var x = new Dictionary<string, List<floatÂ»();</syntaxhighlight>
等同于
<syntaxhighlight lang="csharp">Dictionary<string, List<floatÂ» x = new Dictionary<string, List<floatÂ»();</syntaxhighlight>
它只是一个语法糖，这个特性被匿名类型声明时所需要
Lambda表达式.
Lambda表达式（无函式名称的物件方法在程式语言中的表达语法）: 
<syntaxhighlight lang="csharp">
listOfFoo.Where(
)</syntaxhighlight>
<syntaxhighlight lang="csharp">listOfFoo.Where(x => x.Size > 10);</syntaxhighlight>
编译器翻译Lambda表达式为强类型委托或强类型表达式树。
注意事项：
自动化属性.
编译器将自动生成私有变量和适当的getter（get访问器）和setter（set访问器），如：
<syntaxhighlight lang="csharp">
public string Name
</syntaxhighlight>
扩展方法.
扩展方法能够使现有的类型添加方法，而无需创建新的派生类型、重新编译或以其它方式修改原始类型。
使用扩展方法，必须在一个非嵌套、非泛型的静态类中定义一个静态方法，方法第一个参数必须附加this关键字作为前缀，第一个参数不能有其它修饰符（如ref或者out），这个方法将被编译器添加到该this的类型中。
<syntaxhighlight lang="csharp">
public static class IntExtensions
int foo = 0;
foo.PrintPlusOne();
</syntaxhighlight>
注意事项：
分部方法.
允许代码生成器生成方法声明作为扩展点，如果有人在另一个部分类实现了它才会被包含于原代码编译。
例子：
<syntaxhighlight lang="csharp">
partial class C
partial class C
</syntaxhighlight>
C# 4.0的特性.
dynamic类型.
C# 4.0新增dynamic关键字，提供动态编程（dynamic programming），把既有的静态物件标记为动态物件，类似javascript, Python或Ruby。
dynamic关键字标记的实例被处理成一个特殊包装的object对象，取消了CLI的编译时类型检查，编译时被假定支持任何操作，但如果并不实际支持则运行时报错。
<syntaxhighlight lang="csharp">
dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);
</syntaxhighlight>
具名参数与可选参数.
<syntaxhighlight lang="csharp">
public StreamReader OpenFile(
</syntaxhighlight>
呼叫OpenFile时，顺序可以完全颠倒：
<syntaxhighlight lang="csharp">
OpenFile(bufferSize: 4096, path: "foo.txt");
</syntaxhighlight>
与COM组件互动.
在C#中打开一个Word文件：
<syntaxhighlight lang="csharp">
static void Main(string[] args) {
</syntaxhighlight>
在C#中指定Excel的某一格文字：
<syntaxhighlight lang="csharp">
excelObj.Cells5.Value = "This is sample text";
</syntaxhighlight>
泛型的协变和逆变.
C# 4.0支援协变和逆变，例如在泛型介面可以加上in、out-{zh:修饰字;zh-hk:修饰字;zh-cn:关键字}-。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
C# 5.0的特性.
Async.
async和await是一对语法糖，允许开发人员非常轻松的调用基于TASK的异步编程。async-await关键字并不会真的创建一个线程池任务，完成这个动作依赖于被调用方法中的函数。 
Caller info attributes.
CallerInfoAttributes用于调试时访问调用者的信息。包括三个主要的类：
<syntaxhighlight lang="csharp">
using System;
using System.Runtime.CompilerServices;
namespace TestPro
/*
程序执行以后会显示以下内容。
Message: Test.
Caller Name: Main
Caller FilePath: C:UsersAdministratorsource
eposTestProProgram.cs
Caller Line number: 10
请按任意键继续. . .*/
</syntaxhighlight>
带参数的泛型构造函数.
这个的加入给一些设计增加了强大功能，泛型早在C#2.0加入后就有着强大的应用，一般稍微设计比较好的框架，都会用到泛型，C#5.0加入带参数泛型构造函数，则在原有基础上对C#泛型完善了很多。
<syntaxhighlight lang="csharp">
class MyClass<T>
</syntaxhighlight> 
case支持表达式.
以前case里只能写一个具体的常量，而现在可以加表达式
<syntaxhighlight lang="csharp">
switch(myobj){
</syntaxhighlight>
扩展属性.
<syntaxhighlight lang="csharp">
[Associate(string)]
</syntaxhighlight>
支持null类型运算.
<syntaxhighlight lang="csharp">
int x? = null;
int y? = x + 40;
Myobject obj = null;
Myotherobj obj2 = obj.MyProperty ??? new Myotherobj();
</syntaxhighlight>
C# 6.0的特性.
只读自动属性.
不必使用完整属性语法定义属性。可以在声明属性的位置或类型的构造函数中初始化属性。
<syntaxhighlight lang="csharp">
class Person
</syntaxhighlight>
具有表达式体的函数成员.
可以采用与用于 lambda 表达式相同的轻量语法，声明代码为单个表达式的成员。具有立即仅返回表达式结果，或单个语句作为方法主体。C# 6.0支持方法和属性get。C# 7.0扩展支持了构造函数、终结器、属性set、索引器。
<syntaxhighlight lang="csharp">
using System;
public class Person
</syntaxhighlight>
使用静态类.
可以导入静态类型的可访问静态成员，以便可以在不使用类型名限定访问的情况下引用成员。
<syntaxhighlight lang="csharp">
using System;
using static System.Console;
namespace _usingStatic
</syntaxhighlight>
nameof 运算符.
<syntaxhighlight lang="csharp">
class Program
</syntaxhighlight>
内插字符串.
以$为前缀构造字符串。 内插字符串表达式类似于包含表达式的模板字符串。内插字符串表达式通过将包含的表达式替换为表达式结果的ToString表现形式来创建字符串。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
想要在内插字符串中包含大括号“{” 或 “}”，使用两个大括号，即 “”。
NULL 条件运算符.
用于在执行成员访问 ?. 或索引 ?[ 操作之前，测试是否存在 NULL 值。
<syntaxhighlight lang="csharp">
//普通的委托调用
</syntaxhighlight>
Catch 和 Finally 区块中的 Await.
<syntaxhighlight lang="csharp">
async Task Test()
</syntaxhighlight>
索引初始设定.
<syntaxhighlight lang="csharp">
</syntaxhighlight>
异常过滤器 (Exception filters).
<syntaxhighlight lang="csharp">
</syntaxhighlight>
C# 7.0的特性.
具有表达式体的函数成员.
可以采用与用于 lambda 表达式相同的轻量语法，声明代码为单个表达式的成员。具有立即仅返回表达式结果，或单个语句作为方法主体。C# 6.0支持方法和属性get。C# 7.0扩展支持了构造函数、终结器、属性set、索引器。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
<syntaxhighlight lang="csharp">
using System;
public class Location
</syntaxhighlight>
out 变数.
能够直接宣告一个变数在它要传入的地方，当成一个 out 的引数
<syntaxhighlight lang="csharp">
static void AssignVal(out string strName)
static void Main(string[] args)
</syntaxhighlight>
弃元.
元组/对象的解构：
使用 is/switch 的模式匹配：
对具有 out 参数的方法的调用：
作用域内独立使用场景：
元组.
<syntaxhighlight lang="csharp">
//Just call above method and it will return multiple values 
Console.WriteLine($"Emp info as {empInfo .Item1} {empInfo .Item2} {empInfo .Item3} {empInfo .Item4}.");
//也可以给元组中各项命名：
} 
//Now when you call method get values with specific name as below 
var empInfo1= getEmpInfo();
Console.WriteLine($"Emp info as {empInfo1.strFName} {empInfo1.strAdd} {empInfo1.strC} {empInfo1.strSt}.");
</syntaxhighlight>
.NET有Tuple类型，但是它是一个引用类型，会导致性能问题，但是C＃7.0带来了具有值类型的Tuple，该类型具有更快的性能和可变的类型。
大多数时候，不想访问整个元组包，或者只需要内部值，那么可以使用元组解构并获取所需的值
<syntaxhighlight lang="csharp">
</syntaxhighlight>
记录类型.
记录类型只不过是属性和变量的容器。借助记录类型可以减少工作量。
<syntaxhighlight lang="csharp">
//一个带有属性，构造函数和变量的类，因此访问和声明变量需要编写更多代码:
//具有相同功能的记录类型:
class studentInfo(string StudentFName, string StudentMName, string StudentLName);
</syntaxhighlight> 
不可为空的引用类型.
<syntaxhighlight lang="csharp">
int objNullVal; //non-nullable value type
int? objNotNullVal; //nullable value type
string! objNotNullRef; //non-nullable reference type 不可为空的引用类型
string objNullRef; //nullable reference type 
</syntaxhighlight>
本地方法.
可以在其中使用out或ref。
<syntaxhighlight lang="csharp">
private static void Main(string[] args)
</syntaxhighlight>
数值字面量中包含下划线分隔符以提高可读性.
<syntaxhighlight lang="csharp">
</syntaxhighlight>
模式匹配.
允许在IS语句和SWITCH语句中把模式与任何数据类型匹配。模式可以是常量模式、类型模式、变量模式。
<syntaxhighlight lang="csharp">
class Calculate();
class Add(int a, int b, int c) : Calculate;
class Substract(int a, int b) : Calculate;
class Multiply(int a, int b, int c) : Calculate;
Calculate objCal = new Multiply(2, 3, 4);
switch (objCal)
</syntaxhighlight>
变量作为Ref从方法返回.
通过Ref传递一个变量，将它作为Ref返回，并将它们存储为Ref
<syntaxhighlight lang="csharp">
</syntaxhighlight>
在上面的示例中，我们通过从方法返回Ref找到并替换了字符串。
从表达式中抛出异常.
<syntaxhighlight lang="csharp">
public string getEmpInfo( string EmpName)
</syntaxhighlight>
C# 7.1的特性.
async Main方法.
<syntaxhighlight lang="csharp">
static async Task Main()//注意返回Task
</syntaxhighlight>
default常值运算式.
<syntaxhighlight lang="csharp">
Func<int, string> whereClause = default;
</syntaxhighlight>
推断的 tuple 项目名称.
<syntaxhighlight lang="csharp">
int count = 3;
string colors = "colors of the flag";
var tupleCol = (count,colors); // here syntax gets trimmed
</syntaxhighlight>
C# 7.2的特性.
有条件的“ref”.
<syntaxhighlight lang="csharp">
ref var finalVal = ref (value1 != null ? ref val1_arr: ref val2_arr[0);
</syntaxhighlight>
无需名称的非尾部命名参数.
如果参数的顺序正确，则无需为参数配上名称
<syntaxhighlight lang="csharp">
//suppose I have written a function and used below named arguments
EmpDetails(EmpID: 3, firstName: "Manavya", City: "Daswel");
//here in C#7.2, I can write the above code line as
EmpDetails(EmpID: 3, "Manavya", City: "Daswel");
//if you observed that firstName: "Manavya" is replaced by only "manavya" 
// and it is the beauty of the C#7.2
</syntaxhighlight>
数值常值中的前置下划线分隔符.
<syntaxhighlight lang="csharp">
// 在C# 7.2中，_可以用在`0x`或`0b`之后
0x_1_2 // C# 7.2及更高版本可用
0b_1_0_1 // C# 7.2及更高版本可用
</syntaxhighlight>
私有保护访问修饰符.
只有当前项目里的继承关系才能用，出了这个程序集就没办法用了，即 private protected 为私有继承（protected 且 internal）。
C# 7.3的特性.
改进stackalloc运算符.
<syntaxhighlight lang="csharp">
int* Array1 = stackalloc int {5, 6, 7};//老语法
Span<int> Array = stackalloc [] {10, 20, 30};//新语法
</syntaxhighlight>
固定语句支持更多类型.
固定语句是防止垃圾回收器清除可移动变量的语句，可以使用fixed关键字创建这些语句。从C＃7.3开始，固定语句支持具有以下内容的任何类型：GetPinnableReference()方法，返回的ref T是固定的。
非托管约束.
一个成员是一个非托管型，如果它是byte，short，sbyte，int，long，char，bool类型。可以使用非托管约束来显示类型参数必须是具有非指针的非托管类型。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
还可以使用System.Enum和System.Delegate作为基类约束。
元组支持等于和不等于运算符.
<syntaxhighlight lang="csharp">
</syntaxhighlight>
重载的“in”方法的更改.
为“按引用”和“按值”方法命名相同的方法时，它会抛出歧义异常，为避免此错误，C＃7.3使用了“in”方法：
<syntaxhighlight lang="csharp">
</syntaxhighlight>
扩展参数边界.
可以在构造函数初始值设定项、属性初始值设定项中定义out参数。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
C# 8.0的特性.
可释放的引用结构.
声明为ref 的struct 无权实现任何接口，因为无权实现IDisposable 接口。必须使我们需要使用可释放的ref结构来访问void Dispose()方法。也可以配置readonly ref结构。
表达式形式的Switch关键字.
switch用于模式匹配的表达式及其语法有所变化。
<syntaxhighlight lang="csharp">
</syntaxhighlight> 
空值结合赋值运算符.
??=空值结合赋值运算符（null-coalescing）：
以代替啰嗦的写法：
<syntaxhighlight lang="csharp">
</syntaxhighlight>
局部静态函数.
将局部函数设为static函数，可证明局部函数不包含内部封闭循环中的变量。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
默认接口方法.
允许在声明接口时为接口成员提供默认实现。
=将结构成员设为只读.
现在可以将struct成员设为只读，而不是将整个struct成员设置为只读。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
插值字符串的增强.
string以$开头，这样的string则称为插值string，可包含插值表达式：
<syntaxhighlight lang="csharp">
</syntaxhighlight>
逐字字符串以@"开头。在C＃8中，$@""或者@$""表示可以通过@或$来开始string。在早期版本的C＃中，@仅在$之后被允许。
stackalloc作为表达式.
语法：stackalloc T 其中T是非托管类型，E是类型int的表达式。stackalloc用作表达式，如果返回结果System.Span<T>。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
新型索引(Index )和区间（Range）类型.
System.Index和System.Range用于从列表/数组中获取项。
^（脱字符）表示索引符号。通常，从数组中获取项目时，索引以开头0，但是当使用这种新类型时，其索引(indices)从结尾开始并向上。
..范围运算符获取其操作数的开始和结束。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
在上面的示例中，数组中有四个项；索引从0开始，以3结束；但是对于索引(indices)从^ 4到^ 1。 
using 关键字声明变量.
using关键字声明变量，并在使用该变量的地方结束之前释放该变量：
<syntaxhighlight lang="csharp">
</syntaxhighlight> 
消费异步流.
异步流由一个方法执行，该方法使用IAsyncEnumerable<T>枚举器返回异步流。此方法声明为anync修饰符，此函数还包含yield return 语句用于返回异步流。为了消费anync流，我们需要在实际返回值之前使用await关键字。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
C# 9.0的特性.
新的「Record」类型.
记录类型， 是一种引用类型， 默认是不可变的。 记录类型的相等判断可以通过引用或者结构进行判断的。
<syntaxhighlight lang="csharp">
// 默认不可变的记录类型
public record Person(string Name, int Age);
// 可变记录类型
public record MutablePerson(string Name, int Age) {
var person1 = new Person("Alice", 40);
var person2 = new Person("Alice", 40);
Console.WriteLine(person1 == person2); // True 结构相同
Console.WriteLine(person1.Equals(person2)); // True 结构相同
Console.WriteLine(ReferenceEquals(person1, person2)); // False, 引用不同
// 改变默认的记录！ --> 创建一个新的记录。
var person3 = person1 with { Age = 43 };
Console.WriteLine(person3 == person1); // False 结构不同
// 解构 (Destruct) 一个记录， 将记录的属性提取为本地变量
var (name, age) = person3;
var person4 = new MutablePerson("Alice", 40);
person4.Age = 43;
// 记录类型也可以被继承
public record Citizen(string Name, int Age, string Country) : Person(Name, Age);
var citizen = new Citizen("Alice", 40, "China");
Console.WriteLine(person1 == citizen); // False 类型不同；
</syntaxhighlight>
「init」访问子.
init存取子表示该属性所属类型仅能在建构函式(Constructor)中或是属性初始化式子中赋予其值，如果尝试在其他地方设定该属性的值，在编译时便会遭编译器阻止。
范例如下：
在这个范例中，建立了一个codice_15类型，并且属性codice_16与codice_17只能在初始化时赋予其值。
<syntaxhighlight lang="csharp">
public class Student
 public string StudentName { get; init; } = "Default Name";
 public string StudentID { get; init; } = "00000000";
 public Student()
 public Student(string studentName,string studentID)
 StudentName = studentName;
 StudentID = studentID;
</syntaxhighlight>
如果在此时撰写以下程式码：
<syntaxhighlight lang="csharp">
Student DemoStudent = new Student();
DemoStudent.StudentName = "Test Name";
</syntaxhighlight>
编译器便会无法编译并且掷回错误。
而如果要建立学生名称为「Test Name」，学生ID为「0001」的学生，则需要写成：
<syntaxhighlight lang="csharp">
Student DemoStudent = new Student() //物件初始化运算式
</syntaxhighlight>
或是
<syntaxhighlight lang="csharp">
Student DemoStudent = new Student("Test Name","0001"); //借由类型的建构式初始化StudentName以及StudentID。
</syntaxhighlight>
最上层陈述式或称顶级语句.
在以前的版本，开发者在撰写最上层陈述式(如Program.cs)程式码时，需要包含完整的namespace与class架构，因此如果要撰写Hello World程式时，程式码就会是：
<syntaxhighlight lang="csharp">
using System;
namespace ConsoleApp1
</syntaxhighlight>
但是在C#9.0之后，最上层语句(top-level statement)的程式码不需要包含namespace以及class，可将其简化为：
<syntaxhighlight lang="csharp">
using System;
Console.WriteLine("Hello World!");
//或者简化为一行语句：
System.Console.WriteLine(“Hello World!”);
</syntaxhighlight>
注意， 一个程序中， 只能有一个文件使用顶级语句， 并且顶级语句必须位于命名空间或类型定义之前！
lambda弃元参数.
在 C# 9 之前，即便不使用的 Lambda 参数也需要给它命名。C# 9 支持弃元参数一方面简化了命名，另一方面也节省了内存分配。更重要的是它使得编程的意图更明确，让人一看就知道这个参数是不用的，增强了代码的可读性和可维护性。
只能初始化的设置器.
Init only setters，只能通过对象初始化进行赋值的属性。
<syntaxhighlight lang="csharp">
public class InitDemo {
// initDemo.Start = "Now"; // Error
// initDemo.End = "Tomorrow"; // Error
var initDemo = new InitDemo {
};
</syntaxhighlight>
函数指针.
使用 delegate* 可以声明函数指针。
<syntaxhighlight lang="csharp">
unsafe class FunctionPointer {
public void Test() {
</syntaxhighlight>
跳过本地初始化.
<syntaxhighlight lang="csharp">
[System.Runtime.CompilerServices.SkipLocalsInit]
static unsafe void DemoLocalsInit() {
</syntaxhighlight>
原生整数类型.
两个新的整数类型 nint 和 nunit ， 依赖宿主机以及编译设定。
协变返回类型.
协变返回类型为重写方法的返回类型提供了灵活性。覆盖方法可以返回从被覆盖的基础方法的返回类型派生的类型。
模块初始化代码.
ModuleInitializerAttribute 为组件 (assembly) 定义初始化代码， 当初始化/加载时执行， 可以类比类的静态构造函数， 但是是组件级别的。
静态 lambda 表达式.
static 修饰符添加到 lambda 表达式或匿名方法 。这将无法捕获局部变量或实例状态，从而防止意外捕获其他变量。
分部方法扩展.
移除了分部方法的下述限制：
初始化表达式的简化.
如果创建对象的类型已知时，可以在new表达式中省略该类型。
<syntaxhighlight lang="csharp">
Point p = new(1, 1);
Dictionary<string, int> dict = new();
Point[] points = { new(1, 1), new (2, 2), new (3, 3) };
var list = new List<Point> { new(1, 1), new(2, 2), new(3, 3)};
</syntaxhighlight>
在本地函数上添加标记.
<syntaxhighlight lang="csharp">
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
namespace CoreApp2
</syntaxhighlight>
GetEnumerator 扩展.
可以为任意类型添加一个 GetEnumerator 扩展方法， 返回一个 IEnumerator 或者 IAsyncEnumerator 实例， 从而在 foreach 循环中使用。
<syntaxhighlight lang="csharp">
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace CoreApp2
}</syntaxhighlight>
模式匹配增强.
Type patterns 类型匹配，判断一个变量的类型
<syntaxhighlight lang="csharp">
object obj = new int();
var type = obj switch {
Console.WriteLine(type); // int
</syntaxhighlight>
Relational patterns 关系匹配：
<syntaxhighlight lang="csharp">
class Person { 
class Program
</syntaxhighlight>
Conjunctive and patterns 逻辑合取匹配：
<syntaxhighlight lang="csharp">
// And pattern
var person1 = new Person("Alice", 40);
var ageInRange = person1 switch {
};
Console.WriteLine(ageInRange); // Alice is greater than 18
</syntaxhighlight>
Disjunctive or patterns 逻辑析取匹配：
<syntaxhighlight lang="csharp">
// Or pattern
var person1 = new Person("Alice", 40);
var ageInRange = person1 switch {
};
Console.WriteLine(ageInRange); // 18 or greater
</syntaxhighlight>
Negated not patterns 逻辑非匹配
<syntaxhighlight lang="csharp">
// Not pattern
var person1 = new Person("Alice", 40);
var meOrNot = person1 switch {
};
Console.WriteLine(meOrNot); // Me :-)
</syntaxhighlight>
Parenthesized patterns 带括号的优先级匹配：
<syntaxhighlight lang="csharp">
// Parenthesized patterns
var is10 = new IsNumber(true, 10);
var n10 = is10 switch {
};
Console.WriteLine(n10); // 10
</syntaxhighlight>
C# 10.0的特性.
record struct.
解决了 record 只能给 class 而不能给 struct 用的问题：
sealed record ToString 方法.
可以把 record 里的 ToString 方法标记成 sealed
结构的无参数构造函数.
无参数的结构体构造函数（Parameterless constructors in structs）。无参构造函数使得new struct() 和 default(struct) 的语义不一样。
<syntaxhighlight lang="csharp">
</syntaxhighlight>
用with创建新的匿名类型对象.
这里 y.A 将会是 3 。
全局的 using.
可以给整个项目启用 using，不需要每个文件都写一份。
文件范围的 namespace.
以前写 namespace 还得带一层大括号。现在如果一个文件里只有一个 namespace 的话，直接在文件开头写：
namespace MyNamespace;
lambda的改进.
指定返回值类型.
此前 C# 的 lambda 返回值类型靠推导，C# 10允许在参数列表之前显式指定 lambda 返回值类型：
头等函数.
函数可以隐式转换到 delegate，于是函数上升为头等函数(first function)：
自然委托类型.
lambda 可自动创建自然委托类型，于是不再需要写出类型：
CallerArgumentExpression.
使用CallerArgumentExpression这个attribute，编译器会自动填充调用参数的表达式字符串，例如：
当你调用 Foo(4 + 5) 时，会输出 4 + 5 = 9。这对测试框架极其有用 
tuple 的混合定义和使用.
于是 y 就变成 2 了，同时还创建了两个变量 x 和 z，分别是 1 和 3 。
接口支持抽象静态方法.
.NET 6中这个特性为preview特性。
在方法上指定 AsyncMethodBuilder.
在方法上用 [AsyncMethodBuilder(...)]，来使用自己实现的 async method builder，代替自带的 Task 或者 ValueTask 的异步方法构造器。有助于实现零开销的异步方法。
line 指示器支持行列和范围.
以前 #line 只能用来指定一个文件中的某一行，现在可以指定行列和范围：
嵌套属性模式匹配改进.
以前在匹配嵌套属性的时候需要这么写：
现在只需要简单的：
改进的字符串插值.
实现接近零开销的字符串插值。
Source Generator v2.
包括强类型的代码构建器，以及增量编译的支持等