C# 14 语法概述
C# 14 是 C# 编程语言的最新版本,与 .NET 10 一起发布(目前处于预览阶段,预计 2025 年 11 月正式发布)。它构建在之前的 C# 版本基础上,因此其语法包括所有经典 C# 元素,并引入了一些新特性来提升代码简洁性、性能和灵活性。作为一个想学习的用户,我会先从基础语法开始讲解,这些是 C# 的核心,无论版本如何。然后,我会详细说明 C# 14 的新语法特性,包括描述、语法解释和代码示例。
注意:C# 是静态类型、面向对象的语言,支持泛型、LINQ 等高级功能。要运行 C# 代码,你需要 Visual Studio 或 .NET SDK。基础语法在所有版本中一致,新特性需要在项目中启用 C# 14(通过 <LangVersion>14</LangVersion>
在 .csproj 文件中)。
1. 基础 C# 语法
C# 程序的基本结构是一个命名空间中的类,包含 Main 方法作为入口点。下面从简单到复杂逐步讲解。
1.1 程序结构和命名空间
- C# 代码通常组织在命名空间中。
- 入口点是
static void Main(string[] args)
方法。
示例:
using System; // 导入命名空间
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
1.2 变量和数据类型
- 变量声明:
类型 变量名 = 值;
- 基本类型:int、double、string、bool、char 等。
- 支持 var 隐式类型(编译时推断)。
- 常量:const 类型 变量名 = 值;
示例:
int age = 25; // 整数
double height = 1.75; // 浮点数
string name = "Alice"; // 字符串
bool isStudent = true; // 布尔
var score = 90.5; // 隐式类型 (double)
const int MaxAge = 100; // 常量
1.3 运算符和表达式
- 算术:+、-、*、/、%
- 比较:==、!=、>、<、>=、<=
- 逻辑:&&、||、!
- 赋值:=、+=、-= 等
- 三元运算符:条件 ? 值1 : 值2
示例:
int x = 10;
int y = 5;
int sum = x + y; // 15
bool isGreater = x > y; // true
string result = (x > y) ? "x 大" : "y 大"; // "x 大"
x += 2; // x 现在是 12
1.4 控制结构
- if-else:
if (age > 18)
{
Console.WriteLine("成人");
}
else
{
Console.WriteLine("未成年");
}
- switch:
switch (day)
{
case 1:
Console.WriteLine("周一");
break;
default:
Console.WriteLine("未知");
break;
}
- 循环:for、while、do-while、foreach
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
int[] numbers = {1, 2, 3};
foreach (int num in numbers)
{
Console.WriteLine(num);
}
1.5 方法(函数)
- 定义:访问修饰符 返回类型 方法名(参数) { ... }
- 支持重载(同名不同参数)。
示例:
public int Add(int a, int b)
{
return a + b;
}
// 调用
int result = Add(3, 4); // 7
- Lambda 表达式(匿名方法):
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 25
1.6 类和对象
- 类定义:class 类名 { ... }
- 属性:public 类型 属性名 { get; set; }
- 构造函数:public 类名(参数) { ... }
示例:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void Greet()
{
Console.WriteLine($"Hello, {Name}!");
}
}
// 使用
Person p = new Person("Bob", 30);
p.Greet();
1.7 继承和接口
- 继承:class 子类 : 基类
- 接口:interface 接口名 { 方法签名; }
示例:
interface IAnimal
{
void Speak();
}
class Dog : IAnimal
{
public void Speak()
{
Console.WriteLine("Woof!");
}
}
1.8 数组、集合和泛型
- 数组:类型[] 数组名 = new 类型[大小];
- List:动态集合。
- 泛型:class MyClass { ... }
示例:
int[] arr = {1, 2, 3};
List<string> names = new List<string> { "A", "B" };
names.Add("C");
1.9 异常处理
- try-catch-finally
示例:
try
{
int div = 10 / 0;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("清理");
}
1.10 其他基础元素
- 枚举:enum Day { Monday, Tuesday };
- 委托:delegate void MyDelegate(string msg);
- 事件:event MyDelegate OnEvent;
- LINQ:查询语法,如 from x in collection where x > 0 select x;
这些是 C# 的核心基础。如果你需要深入某个部分,可以问具体主题。
2. C# 14 的新语法特性
C# 14 引入了几个新特性,主要聚焦于简化代码、提升性能和扩展语言表达力。下面是所有主要新特性的详细讲解,基于官方文档和相关文章。<grok:render card_id="e809ee" card_type="citation_card" type="render_inline_citation">
1
</grok:render><grok:render card_id="5ba13e" card_type="citation_card" type="render_inline_citation">
22
</grok:render>
2.1 Extension Members (扩展成员,也称“扩展一切”)
描述: 允许定义扩展属性、索引器和静态扩展成员,而不仅仅是扩展方法。这些成员可以扩展实例或类型本身,看起来像扩展类型的静态成员。
语法解释: 使用 extension
关键字定义扩展块,指定接收者类型在括号中。实例成员有接收者参数,静态成员没有。
代码示例:
public static class EnumerableExtensions
{
// 实例扩展
extension<T>(IEnumerable<T> source)
{
public bool IsEmpty => !source.Any();
public T this[int index] => source.Skip(index).First();
}
// 静态扩展
extension<T>(IEnumerable<T>)
{
public static IEnumerable<T> Empty => Enumerable.Empty<T>();
}
}
// 使用
IEnumerable<int> seq = new[] {1, 2};
bool empty = seq.IsEmpty; // false
IEnumerable<int> emptySeq = IEnumerable<int>.Empty;
2.2 The field
Keyword (field 关键字)
描述: 在属性访问器中使用 field
访问编译器生成的 backing field,而无需显式声明字段。这简化了属性逻辑,如空检查(从 C# 13 预览中正式引入)。
语法解释: 在 get 或 set 中使用 field
。如果有命名冲突,使用 @field
或 this.field
。
代码示例:
public class Product
{
public string Name
{
get => field;
set => field = value?.Trim() ?? throw new ArgumentNullException(nameof(value));
}
}
2.3 Implicit Span Conversions (隐式 Span 转换)
描述: 为 Span<T>
和 ReadOnlySpan<T>
提供一级语言支持,包括与数组的隐式转换,提升性能和内存安全。
语法解释: 支持 ReadOnlySpan<T>
、Span<T>
和 T[]
之间的隐式转换,可作为扩展方法接收者和泛型推断。
代码示例:
Span<int> span = new int[10]; // 从数组隐式转换
ReadOnlySpan<char> ros = "hello"; // 从字符串隐式
2.4 Unbound Generic Types with nameof
(nameof 支持未绑定泛型类型)
描述: nameof
运算符现在支持未绑定泛型类型,返回类型名而无需指定类型参数。
语法解释: 直接使用如 nameof(List<>)
。
代码示例:
string typeName = nameof(List<>); // "List"
2.5 Modifiers on Simple Lambda Parameters (简单 Lambda 参数的修饰符)
描述: Lambda 参数可以添加 ref
、in
、out
、scoped
等修饰符,而无需指定类型,简化 Lambda 语法(params
除外)。
语法解释: 参数列表中直接添加修饰符。
代码示例:
delegate bool TryParse<T>(string text, out T result);
TryParse<int> parse = (text, out result) => int.TryParse(text, out result);
2.6 More Partial Members (更多部分成员,包括部分构造函数和事件)
描述: 扩展部分类型支持实例构造函数和事件,允许签名在一个部分中定义,实现 在另一个中。
语法解释: 部分构造函数需要一个定义声明和一个实现声明;事件需要 get/remove 访问器。
代码示例:(示例基于描述,无官方代码)
// File1.cs
partial class MyClass
{
partial MyClass(int x); // 定义
partial event EventHandler MyEvent; // 定义
}
// File2.cs
partial class MyClass
{
partial MyClass(int x) { /* 实现 */ }
partial event EventHandler MyEvent { add { ... } remove { ... } } // 实现
}
这些新特性使 C# 更现代化。如果你想练习代码或深入某个特性,告诉我!