这次记录C#的历史情况。
1、 C#版本1.0;
C# 1.0 是微软在 .NET 平台推出的第一个版本的 C# 语言,它与 .NET Framework 1.0 一同发布于 2002 年 2 月 13 日。这个版本的 C# 语言设计目标是成为一种“简单、现代、通用的面向对象的语言”,并且与 Java 有很多相似之处。C# 1.0 的主要特性包括:
l 类(Classes)
l 结构(Structs)
l 接口(Interfaces)
l 事件(Events)
l 属性(Properties)
l 委托(Delegates)
l 表达式、语句、操作符(Expressions, Statements, Operators)
l 特性(Attributes)
l 字面值(Literals)
这些特性构成了 C# 语言的核心,为后续版本的演进奠定了基础。尽管与现代的 C# 版本相比,C# 1.0 缺乏许多高级特性,如泛型、LINQ、Lambda 表达式等,但它在当时为开发者提供了一个强大的、类型安全的面向对象编程环境。随着时间的推移,C# 语言不断进化,引入了更多现代化的语言特性,以适应不断变化的软件开发需求。
2、 C#版本1.2;
C# 1.2 是随 Visual Studio .NET 2003 和 .NET Framework 1.1 一起发布的版本,发布时间为 2003 年 4 月。这个版本对 C# 语言进行了一些小的改进,其中最值得注意的是,从这个版本开始,如果 IEnumerator 实现了 IDisposable 接口,那么在 foreach 循环中生成的代码会在 IEnumerator 上调用 Dispose 方法。这有助于确保资源的正确释放,是 C# 语言在迭代器和资源管理方面的一个重要进步。
3、 C#版本2.0;
C# 2.0 是微软在 2005 年 11 月发布的 C# 语言的第二个主要版本,与 .NET Framework 2.0 一同发布。这个版本引入了许多重要的新特性,包括:
l 泛型(Generics):允许创建可以操作任意类型的类型和方法,同时保持类型安全。
l 部分类型(Partial Types):允许将类型的不同部分分散在多个文件中,这在大型项目中非常有用。
l 匿名方法(Anonymous Methods):提供了一种不命名委托的方法,可以直接在声明委托的地方编写方法体。
l 可空类型(Nullable Types):允许值类型有 null 值,这对于数据库操作和其他需要表示缺失值的情况非常有用。
l 迭代器(Iterators):允许使用 foreach 循环来迭代集合中的元素,提高了代码的可读性和简洁性。
l 协变和逆变(Covariance and Contravariance):改进了泛型和委托的灵活性,使得可以更自然地使用泛型类型和委托。
此外,C# 2.0 还引入了一些对现有特性的改进,例如 getter 和 setter 可以有单独的访问级别,方法组到委托的转换,静态类,以及委托推断等。
这些新特性使得 C# 2.0 成为了一个更加强大和灵活的语言,为开发者提供了更多的工具来构建复杂的应用程序。C# 2.0 的发布标志着 C# 语言的成熟,为后续版本的演进奠定了坚实的基础。
4、 C#版本3.0;
C# 3.0 是一个重要的里程碑版本,它在 2007 年 11 月发布,与 Visual Studio 2008 和 .NET Framework 3.5 一同发布。这个版本引入了许多革命性的语言特性,使得 C# 成为了一个真正强大的编程语言。以下是 C# 3.0 的一些主要新特性:
l 自动实现的属性(Auto-implemented properties):允许开发者在不编写后备字段的情况下声明属性。
l 匿名类型(Anonymous types):允许创建没有显式名称的类,通常用于 LINQ 查询。
l 查询表达式(Query expressions):也称为语言集成查询(LINQ),允许使用声明性 SQL 风格的语法来操作数据集合。
l Lambda 表达式(Lambda expressions):提供了一种简洁的方式来编写匿名函数。
l 表达式树(Expression trees):允许将 Lambda 表达式表示为树状的数据结构,这在 LINQ 提供者和动态语言实现中非常有用。
l 扩展方法(Extension methods):允许为现有类型添加新方法,而不需要修改原始类型。
l 隐式类型本地变量(Implicitly typed local variables):在 var 关键字的帮助下,编译器可以根据赋值自动推断局部变量的类型。
l 部分方法(Partial methods):允许在部分类定义中声明方法签名,实现可以省略,直到调用方需要时才提供。
l 对象和集合初始值设定项(Object and collection initializers):允许在创建对象时直接初始化其属性,以及在创建集合时初始化其元素。
这些特性的引入,特别是 LINQ 和 Lambda 表达式,极大地提高了 C# 语言的表达能力和灵活性,使得 C# 成为了一个更适合于函数式编程和数据处理的语言。C# 3.0 的发布标志着 C# 语言的成熟,为后续版本的演进奠定了坚实的基础。
5、 C#版本4.0;
C# 4.0 是随着 .NET Framework 4.0 的发布而推出的,发布日期为 2010 年 4 月 12 日。这个版本引入了几项重要的新特性,主要包括:
l 动态绑定(Dynamic Binding):引入了 dynamic 关键字,允许开发者编写动态类型的对象,这在与动态语言交互或者在运行时才确定类型的情况下非常有用。
l 命名参数和可选参数(Named and Optional Parameters):提供了更加灵活的参数传递方式,允许调用方法时指定参数名称,以及为某些参数提供默认值。
l 泛型协变和逆变(Generic Covariance and Contravariance):允许在泛型类型中使用 out 和 in 关键字来声明协变和逆变,这使得某些泛型接口和委托的使用更加灵活。
l 互操作性(Interop):改进了与 COM 组件的互操作性,允许在 COM 调用点省略 ref 关键字,并能够嵌入 COM 互操作类型。
这些新特性使得 C# 4.0 成为了一个更加强大和灵活的语言,特别是在处理动态类型和改进泛型使用方面。C# 4.0 的发布进一步推动了 .NET 平台的发展,为开发者提供了更多的编程工具和选项。
6、 C#版本5.0;
C# 5.0 是随着 .NET Framework 4.5 在 2012 年 8 月 15 日发布的 C# 语言的一个重要版本。这个版本引入了对异步编程的原生支持,主要通过 async
和 await
关键字实现。这使得开发者能够更简洁地编写异步代码,而不需要传统的回调方法或者复杂的任务同步机制。
除了异步编程的支持,C# 5.0 还引入了调用方信息特性(Caller Information),这使得开发者可以方便地获取调用方法的信息,如文件名、行号和成员名称,这对于日志记录和诊断非常有用。
C# 5.0 还支持空类型运算,允许开发者对可空类型(nullable types)进行算术运算,这是对 C# 2.0 中引入的可空类型的一个重要补充。
此外,C# 5.0 还引入了一些其他的语言改进,如扩展属性(extension properties),这允许扩展方法的提供者为扩展类添加看起来像是类成员的属性。
总的来说,C# 5.0 的发布为 C# 语言带来了异步编程的新时代,并且通过其他一些有用的特性增强了语言的表现力和易用性。这些改进使得 C# 成为了一个更加强大和灵活的编程语言。
7、 C#版本6.0;
C# 6.0 是随着 Visual Studio 2015 的发布而推出的 C# 语言版本,发布日期为 2015 年 7 月 20 日。这个版本包含了许多较小的特性,这些特性使得 C# 编程更加高效和简洁。以下是 C# 6.0 引入的一些主要特性:
l 静态导入(Static imports):允许开发者导入特定的静态成员,这样在使用时就不必每次都指定类名。
l 异常筛选器(Exception filters):在 catch 语句中允许使用过滤器,以便更精细地控制异常的处理。
l 自动属性初始化(Auto-property initializers):允许在声明自动实现的属性时直接指定初始值。
l 表达式主体成员(Expression-bodied members):允许使用 Lambda 表达式或方法来简化成员的实现。
l 空合并赋值(Null-conditional operators):?. 和 ?? 运算符允许在对象可能为 null 的情况下安全地访问成员。
l 字符串插值(String interpolation):通过 $"" 语法,使得字符串格式化更加直观和方便。
l nameof 运算符(nameof operator):允许获取变量或类型的名称,这在反射或错误消息中非常有用。
l 索引初始化器(Index initializers):允许在初始化数组或集合时直接指定索引和对应的值。
l 在 catch/finally 块中使用 await(Await in catch/finally blocks):允许在异常处理和 finally 块中使用 await 关键字。
l 仅限 getter 属性的默认值(Default values for getter-only properties):允许为只读属性指定默认值。
C# 6.0 的这些特性旨在减少代码的冗余,提高代码的可读性和开发效率。同时,这个版本还引入了 Roslyn 编译器平台,它将编译器作为服务提供,使得编译器更加灵活和可扩展。这些改进使得 C# 6.0 成为了一个更加现代化和强大的编程语言。
8、 C#版本7.0;
C# 7.0 是一个重要的版本,它在 2017 年 3 月发布,带来了一系列新的语言特性,旨在简化代码和提高性能。以下是 C# 7.0 引入的一些关键特性:
l Out 变量:允许在声明 out 参数的同时声明局部变量,使得代码更加简洁。
l 元组:引入了元组类型和元组字面量,使得可以轻松地返回多个值,并且可以方便地解构元组。
l 模式匹配:扩展了 is 表达式和 switch 语句,允许使用模式匹配来检查类型和值。
l 本地函数:允许在方法内部定义其他方法,这些方法只能在定义它们的父方法中调用。
l 扩展的表达式主体成员:允许使用表达式来定义属性的 getter 和 setter,以及索引器。
l Ref 局部变量和 Ref 返回:允许方法返回对局部变量的引用,而不是值的副本。
l 弃元:允许在解构时忽略某些不需要的变量。
l 二进制文本和数字分隔符:允许在数字字面量中使用下划线作为分隔符,提高代码的可读性。
l 引发表达式:允许在方法内部直接抛出异常,而不需要调用特定的方法。
这些特性的引入,使得 C# 7.0 成为了一个更加现代化和强大的编程语言,为开发者提供了更多的编程工具和选项。
9、 C#版本7.1;
C# 7.1 是 C# 语言的一个小版本更新,它在 2017 年 8 月发布,作为 Visual Studio 2017 的 15.3 更新的一部分。这个版本的目的是为了让 C# 能够更频繁地更新,引入了一些虽小但有用的新特性,而不是等待大型版本更新。C# 7.1 支持以下新特性:
l 异步 Main 方法(Async Main):允许程序的入口点 Main 方法使用 async 修饰符,使得在控制台应用程序中使用 async 和 await 异步编程模型变得更加简单。
l 目标类型的默认文字(Target-typed default literals):在可以推断目标类型的情况下,允许在默认值表达式中使用 default 文字,使得代码更加简洁。
l 元组元素名称的推断(Inferred tuple element names):在创建元组时,可以根据构造元组的变量名推断元组元素的名称,而不需要显式指定。
l 泛型类型参数的模式匹配(Generic pattern matching):扩展了模式匹配功能,允许在 is 表达式和 switch 语句中使用泛型类型参数。
这些特性的引入使得 C# 7.1 成为了一个更加现代化和灵活的语言,为开发者提供了更多的编程工具和选项。C# 7.1 的发布标志着 C# 语言开始采用更频繁的更新策略,以便更快地将新特性带给开发者。
10、 C#版本7.2;
C# 7.2 是 C# 语言的一个次要版本更新,它在 2017 年 11 月发布,主要关注于提升结构体(struct)的引用相关功能,尤其是在高性能场景下的应用。这个版本的一些关键特性包括:
l stackalloc 数组的初始化:允许在声明时初始化 stackalloc 分配的数组。
l 对任何支持模式的类型的 fixed 语句:可以在不固定(不使用 fixed 关键字)的情况下访问固定(fixed)的字段。
l 重新分配 ref 本地变量:可以在方法中重新分配 ref 关键字指定的引用类型变量。
l readonly struct 类型:声明 readonly struct 类型,指示结构是不可变的,并且应该作为 in 参数传递到其成员方法。
l in 修饰符:在实参上添加 in 修饰符,指定形参通过引用传递,但不通过调用方法修改。
l 方法返回项的 ref readonly 修饰符:指示方法通过引用返回其值,但不允许写入该对象。
l ref struct 类型:声明 ref struct 类型,指示结构类型直接访问托管的内存,且必须始终分配在堆栈上。
l 新的泛型约束:允许使用更多的泛型约束。
l 非尾随命名参数:位置参数可以跟在命名参数后面。
l 数值文本中的前导下划线:数值文字可以在任何打印数字前放置前导下划线,以提高可读性。
l private protected 访问修饰符:private protected 访问修饰符允许同一程序集中的派生类访问。
l 条件 ref 表达式:现在可以引用条件表达式的结果。
这些特性的引入,使得 C# 7.2 成为了一个更加现代化和灵活的语言,特别是在处理结构体和高性能编程方面。C# 7.2 版本的发布,为开发者提供了更多的编程工具和选项,特别是在需要高性能计算的场景中。
11、 C#版本7.3;
C# 7.3 是 C# 语言的一个小版本更新,发布于 2018 年 5 月,作为 Visual Studio 2017 的更新 15.7 的一部分。这个版本继续了性能优化的主题,同时对现有功能进行了增量改进,并引入了一些新的编译器选项。
C# 7.3 的主要新特性包括:
l ref 局部变量重新赋值:允许在方法中重新分配 ref 关键字指定的引用类型变量。
l stackalloc 初始化:stackalloc 现在支持初始化,可以直接在声明时初始化栈分配的数组。
l 固定大小缓冲区的索引:可以直接索引结构体内的固定大小缓冲区,而不需要使用固定语句。
l 改进的 fixed 语句:fixed 语句现在可以操作任何实现了 GetPinnableReference 方法的类型。
l 扩展的泛型约束:现在可以使用 unmanaged 约束来限制泛型参数必须是未托管类型。
l 元组的相等性比较:元组类型现在支持使用 == 和 != 运算符进行比较。
l 属性的字段特性目标:现在可以将属性直接应用于自动实现的属性的后端字段。
l 改进的方法解析:当参数通过 in 关键字区分时,方法解析得到了改进。
l 新的编译器选项:包括 -publicsign 用于开源软件签名,以及 -pathmap 用于源目录映射。
这些特性的引入,使得 C# 7.3 成为了一个更加现代化和灵活的语言,特别是在处理结构体和高性能编程方面。C# 7.3 版本的发布,为开发者提供了更多的编程工具和选项,特别是在需要高性能计算的场景中。
12、 C#版本8.0;
C# 8.0 是一个重要的里程碑版本,它在 2019 年 9 月发布,与 .NET Core 3.0 一同推出。这个版本专注于提升性能和生产力,同时引入了一些新的语言特性,包括:
l 默认接口方法(Default Interface Methods):允许在接口中提供方法的默认实现,这为接口的扩展提供了更大的灵活性。
l 可空引用类型(Nullable Reference Types):这是 C# 8.0 的一个主要特性,它允许开发者明确指定引用类型变量是否可以为 null,以减少空引用异常的风险。
l 异步流(Asynchronous Streams):引入了 IAsyncEnumerable<T> 接口,支持异步枚举数据流,这对于处理大量数据或数据流非常有用。
l 范围操作符和索引(Indices and Ranges):通过 Index 和 Range 类型,使得数组和集合的切片操作更加直观和方便。
l 空合并赋值(Null-Coalescing Assignment):扩展了空合并运算符 ??=,允许在变量为 null 时进行赋值。
l 模式匹配增强:包括开关表达式中的模式匹配、属性模式、元组模式和位置模式等。
l 静态本地函数(Static Local Functions):允许在类内部定义静态方法,这些方法只能在定义它们的类中调用。
l 只读成员(Readonly Members):扩展了 readonly 关键字,允许在结构体中声明只读成员。
l 可处置的 ref 结构体(Disposable Ref Structs):允许在 ref 结构体中实现 IDisposable 接口。
l 堆栈分配的大型数据数组(Stackalloc in nested expressions):允许在嵌套表达式中使用 stackalloc 关键字。
l 增强的内插字符串(Enhancement of interpolated verbatim strings):改进了内插字符串的处理,允许更灵活的字符串插值。
这些特性的引入,使得 C# 8.0 成为了一个更加现代化和强大的编程语言,为开发者提供了更多的编程工具和选项。特别是对于需要高性能计算和处理大量数据的应用场景,C# 8.0 提供了显著的性能优势和便利性。
13、 C#版本9.0;
C# 9.0 是一个重要的版本,它在 2020 年 11 月发布,与 .NET 5 一同推出。这个版本专注于提升性能和生产力,同时引入了一些新的语言特性,包括:
l 记录类型(Records):引入了一种新的类型,用于创建不可变的数据结构,使得值类型的使用更加简洁和安全。
l 顶级语句(Top-level statements):允许在不编写类和 Main 方法的情况下直接在代码文件中编写可执行代码,简化了小型程序和脚本的编写。
l 目标类型 new 表达式(Target-typed new expressions):允许在 new 表达式中省略类型,如果上下文已经明确了类型。
l 协变返回类型(Covariant returns):允许在派生类中重写方法时,返回一个比基类方法返回类型更具体的类型。
l 模式匹配增强(Improved pattern matching):扩展了模式匹配功能,包括简单类型模式、关系模式和逻辑模式。
l init 属性(Init-only setters):允许在属性中使用 init 访问器,使得属性只能在对象初始化时设置。
l 本地函数属性(Attributes on local functions):允许在本地函数上使用属性。
l Lambda 弃元参数(Lambda discard parameters):在 Lambda 表达式中允许使用弃元参数,使得未使用的参数不需要命名。
l 方法指针(Method pointers):允许使用方法指针,提供了一种新的性能优化方式。
l 模块初始化器(Module initializers):允许在程序集加载时执行初始化代码。
l 扩展的分部方法(Extended partial methods):扩展了分部方法的功能,允许更灵活的使用。
l 类型推导的条件表达式(Type-inferred conditional expressions):允许在条件表达式中进行类型推导。
l 本地大小的整型(Native-sized integers):引入了 nint 和 nuint 类型,它们的大小取决于运行的平台。
l 静态匿名方法(Static anonymous methods):允许在 Lambda 表达式和匿名方法中使用 static 关键字。
l 抑制局部变量初始化标志(Suppress emitting localsinit flag):允许抑制编译器发出的 localsinit 标志,这对于性能敏感的代码很有用。
这些特性的引入,使得 C# 9.0 成为了一个更加现代化和强大的编程语言,为开发者提供了更多的编程工具和选项。特别是对于需要高性能计算和处理大量数据的应用场景,C# 9.0 提供了显著的性能优势和便利性。
14、 C#版本10.0;
C# 10.0 是 C# 语言的最新版本之一,它在 2021 年 11 月发布,作为 .NET 6 的一部分。这个版本引入了许多新特性,旨在使代码更简洁、更具表现力和更快速。以下是 C# 10.0 的一些关键新特性:
l 记录结构(Record structs):允许使用 record struct 或 readonly record struct 声明值类型记录,并可以使用 record class 声明引用类型记录。
l 结构类型的改进:可以在结构类型中声明无参数构造函数,并在声明实例字段或属性时对它们进行初始化。with 表达式的左侧操作数可以是任何结构类型或匿名(引用)类型。
l 内插字符串处理程序(Interpolated string handler):可以创建一种类型,该类型从内插字符串表达式生成结果字符串,这有助于提高性能。
l 全局 using 指令(Global using directives):可以将 global 修饰符添加到任何 using 指令,指示编译器该指令适用于编译中的所有源文件。
l 文件范围的命名空间声明(File-scoped namespace declaration):可以使用新的 namespace 声明形式,声明所有后续声明都是已声明的命名空间的成员。
l 扩展属性模式(Extended property patterns):改进了属性模式匹配,使得代码更简洁。
l Lambda 表达式改进:Lambda 表达式可以有自然类型,可以声明返回类型,并且可以应用属性。
l 常数内插字符串(Constant interpolated strings):如果所有占位符本身都是常量字符串,则可以使用常数字符串进行内插。
l 记录类型可以密封 ToString:可以在记录类型中重写 ToString 方法时添加 sealed 修饰符,防止编译器为任何派生的记录类型合成 ToString 方法。
l 在同一析构中进行赋值和声明:取消了早期 C# 版本中的限制,允许在析构中同时进行赋值和声明。
l 改进型明确赋值:针对明确赋值和 Null 状态分析的警告更加准确。
l 允许在方法上使用 AsyncMethodBuilder 特性:可以为单个方法指定异步方法生成器,实现高级性能优化。
l CallerArgumentExpression 属性诊断:可以使用 CallerArgumentExpressionAttribute 来指定编译器用另一个实参的文本表示形式替换的形参,使库可以创建更具体的诊断。
l 增强型 #line 预处理器指令:支持 #line 预处理器指令的新格式,有助于使用特定语言(如 Razor)实现更详细的输出。
这些特性的引入,使得 C# 10.0 成为了一个更加现代化和强大的编程语言,为开发者提供了更多的编程工具和选项。特别是对于需要高性能计算和处理大量数据的应用场景,C# 10.0 提供了显著的性能优势和便利性。
15、 C#版本11.0;
C# 11.0 是 C# 语言的最新版本之一,它在 2022 年 11 月发布,作为 .NET 7 的一部分。这个版本引入了许多新特性,旨在提高开发效率和代码的表达能力。以下是 C# 11.0 的一些关键新特性:
l 泛型属性(Generic attributes):允许创建泛型类作为属性,这样可以更方便地为需要 System.Type 参数的属性提供类型参数。
l 泛型数学支持(Generic math support):在接口中添加了 static abstract 或 static virtual 成员,以定义包含可重载运算符、其他静态成员和静态属性的接口,支持在泛型类型中使用数学运算符。
l 数值 IntPtr 和 UIntPtr(Numeric IntPtr and UIntPtr):nint 和 nuint 类型现在分别别名为 System.IntPtr 和 System.UIntPtr。
l 字符串内插中的换行符(Newlines in string interpolations):在字符串内插表达式中支持换行符,使得多行字符串的书写更加方便。
l 列表模式(List patterns):扩展了模式匹配,以匹配列表或数组中的元素序列,可以使用任何模式来匹配元素。
l 改进的方法组向委托的转换(Improved method group conversion to delegate):编译器现在可以重用从方法组转换创建的委托对象。
l 原始字符串字面量(Raw string literals):引入了原始字符串字面量,可以包含任意文本,包括空格、新行、嵌入引号和其他特殊字符,而不需要转义序列。
l 自动默认结构(Auto-default struct):编译器确保在执行构造函数的过程中,将 struct 类型的所有字段初始化为其默认值。
l UTF-8 字符串字面量(UTF-8 string literals):可以对字符串字面量指定 u8 后缀来指定 UTF-8 字符编码。
l 必需的成员(Required members):可以将 required 修饰符添加到属性和字段,以强制构造函数和调用方初始化这些值。
l ref 字段和 ref scoped 变量(ref fields and ref scoped variables):可以在 ref struct 中声明 ref 字段,并可以向任何 ref 声明添加 scoped 修饰符。
l 文件本地类型(File local types):可以使用 file 访问修饰符创建其可见性范围限定为其声明时所在的源文件的类型。
这些特性的引入,使得 C# 11.0 成为了一个更加现代化和强大的编程语言,为开发者提供了更多的编程工具和选项。特别是对于需要高性能计算和处理大量数据的应用场景,C# 11.0 提供了显著的性能优势和便利性。
16、 C#版本12.0;
C# 12.0 是 C# 语言的最新版本之一,它在 2023 年 11 月发布,作为 .NET 8 的一部分。这个版本引入了许多新特性,旨在提高开发效率和代码的表达能力。以下是 C# 12.0 的一些关键新特性:
l 主构造函数(Primary constructors):允许在任何 class 和 struct 中创建主构造函数,不再局限于 record 类型。这意味着构造函数参数可以在类的整个主体范围内使用,并且所有显式声明的构造函数都必须使用 this() 语法调用主构造函数。
l 集合表达式(Collection expressions):引入了新的简洁语法来创建常见的集合值,如数组、Span<T>、List<T> 等。可以使用展开运算符 .. 将其他集合内联到这些值中。
l ref readonly 参数:C# 添加了 in 参数作为传递只读引用的方法。in 参数允许变量和值,并且无需对参数进行任何注释即可使用。ref readonly 参数提供了一种更清晰的方式来了解可能使用 ref 参数或 in 参数的 API。
l 默认 Lambda 参数(Default Lambda parameters):现在可以为 Lambda 表达式的参数定义默认值,使得代码更加简洁。
l 任何类型的别名(Alias any type):允许为任何类型创建别名,使得代码更加清晰。
l 内联数组(Inline arrays):允许在内存中直接声明和初始化数组,而不需要使用 new 关键字。
l 实验性属性(Experimental attribute):可以使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 来标记类型、方法或程序集,以指示实验性特征。如果访问使用 ExperimentalAttribute 注释的方法或类型,编译器将发出警告。
l 拦截器(Interceptors):作为一项试验性功能,拦截器允许在编译时以声明方式将对可拦截方法的调用替换为对自身的调用。这为高级源生成器和代码转换提供了可能性。
这些特性的引入,使得 C# 12.0 成为了一个更加现代化和强大的编程语言,为开发者提供了更多的编程工具和选项。特别是对于需要高性能计算和处理大量数据的应用场景,C# 12.0 提供了显著的性能优势和便利性。
标签:C#,特性,版本,文章,类型,允许,Net,表达式 From: https://www.cnblogs.com/lzhdim/p/18422962