第三节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2026-01-25 09:26  Yaopengfei  阅读(12)  评论(0)    收藏  举报