第三节:C#13、C#14新语法(数字字符串比较、Null分配、扩展成员新写法等等)
一. C#13
1. Params集合
params 修饰符并不局限于数组类型。 现在可以将 params 用于任何已识别的集合类型
void Concat<T>(params ReadOnlySpan<T> items)
{
for (int i = 0; i < items.Length; i++)
{
Console.Write(items[i]);
Console.Write(" ");
}
Console.WriteLine();
}
2. 隐式索引访问
允许在单维集合的对象初始值设定项表达式中使用“从末端”隐式索引运算符 ^。 例如,现在可以使用对象初始值设定项初始化单维数组,如以下代码所示:
二. C#14
【 C#14语法是基于.Net10的】
1. 用字符串比较数字排序
在 .NET 10 中,System.String 类新增了 CompareAsNumbers 方法,用于按数字顺序比较字符串。这对于包含数字的字符串排序非常有用,例如文件名或版本号。
//声明排序器
StringComparer numericStringComparer = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
//1. 比较是否相同
Console.WriteLine(numericStringComparer.Equals("02", "2")); //True
//2. 排序(比如文件名、版本号)
List<string> list = ["win7", "win11", "win10"];
var temp1 = list.Order(numericStringComparer).ToList();
foreach (var item in temp1)
{
Console.WriteLine(item); //依次 win7 win10 win11
}
//3. 包含关系
HashSet<string> set = new(numericStringComparer) { "007" };
Console.WriteLine(set.Contains("7")); //true
2 禁止重复 JSON 属性的选项
JSON 规范不指定在反序列化 JSON 有效负载时如何处理重复属性。 这可能会导致意外的结果和安全漏洞。
NET 10 引入了 JsonSerializerOptions.AllowDuplicateProperties 禁止重复 JSON 属性的选项 【使用率不高】
//下面代码由于Name属性重复,所以直接进入Catch
var options = new JsonSerializerOptions { AllowDuplicateProperties = false };
string json = @"{ ""Name"": ""Alice"", ""Name"": ""Bob"" }";
try
{
var person = JsonSerializer.Deserialize<Person>(json);
}
catch (JsonException ex)
{
Console.WriteLine($"JSON 反序列化失败: {ex.Message}");
}
3 Null条件分配
在 C# 14 之前,在分配给属性之前,需要对变量进行 null 检查。
可以使用运算符简化上述代码 ?. 只有左侧不为null时才被计算
//C# 14之前的写法
Person person1 = new();
if (person1 != null)
{
person1.Name = "YPF";
}
Console.WriteLine(person1.Name); //YPF
//C# 14 的写法
Person person2 = new();
person2?.Name = "YXY";
Console.WriteLine(person2.Name); //YXY
4 nameof支持未绑定的泛型
从 C# 14 开始,nameof 的参数可以是未绑定的泛型类型。 例如,nameof(List<>) 计算为 List。
在早期版本的 C# 中,只能使用关闭的泛型类型(例如 List<int>)返回 List 名称
{
Console.WriteLine(nameof(List<>)); // Output: List C#14之前不支持
Console.WriteLine(nameof(List<int>)); // Output: List
Console.WriteLine(nameof(Dictionary<,>)); // Output: Dictionary C#14之前不支持
}
5 扩展成员
扩展成员允许您为现有类型添加新方法、属性或事件,而无需修改原始类型的定义。
还可以声明扩展类型的扩展成员,而不是类型的实例。 换句话说,这些新的扩展成员可以作为扩展类型的静态成员出现。
(1) C#14前旧版:静态类+静态方法+this关键字
public static class StringExtensionsOld
{
/// <summary>
/// 判断字符串中是否包含数字
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool ContainsNumber(this string str)
{
return str.Any(char.IsDigit);
}
}
(2) C#14: 可以在extension包裹内进行添加新方法、属性【静态、非静态均可】
public static class StringExtensionsNew
{
//1 普通扩展块
extension(string str)
{
//1.1 扩展属性
public bool ContainsNumber2 => str.Any(char.IsDigit);
//1.2 扩展方法
public string Repeat(int count)
{
return string.Concat(Enumerable.Repeat(str, count));
}
}
//2 静态扩展块
extension(string)
{
//2.1 静态扩展方法
public static string Combine(string first, string second, string? separator = null)
{
return $"{first}{separator}{second}";
}
//2.2 静态扩展属性
public static string SpaceChar => " ";
//2.3 静态用户定义符
public static string operator *(string str, int count)
{
return string.Concat(Enumerable.Repeat(str, count));
}
}
}
最终调用:
string txt1 = "abc";
string txt2 = "a0bc";
//1. C#14之前 判断字符串中是否有数字
Console.WriteLine("--------C#14之前 判断字符串中是否有数字--------");
Console.WriteLine(txt1.ContainsNumber()); //false
Console.WriteLine(txt2.ContainsNumber()); //true
//2. C#14
//2.1 判断字符串中是否有数字
Console.WriteLine("--------C#14 判断字符串中是否有数字--------");
Console.WriteLine(txt1.ContainsNumber2); //false
Console.WriteLine(txt2.ContainsNumber2); //true
//2.2 重复字符串
Console.WriteLine("--------重复字符串--------");
Console.WriteLine(txt1.Repeat(3)); //abcabcabc
//2.3 组合字符串
Console.WriteLine("--------组合字符串--------");
string finalStr = string.Combine("hello", "word", ",");
Console.WriteLine(finalStr); //hello,word
//2.4 静态属性
Console.WriteLine(string.SpaceChar); // " "
//2.5 静态用户定义符号
string repeated = "Hi" * 3;
Console.WriteLine(repeated); //HiHiHi
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://chuna2.787528.xyz/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

浙公网安备 33010602011771号