惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
L
Lohrmann on Cybersecurity
MyScale Blog
MyScale Blog
GbyAI
GbyAI
博客园 - 【当耐特】
J
Java Code Geeks
Jina AI
Jina AI
I
InfoQ
The Register - Security
The Register - Security
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
S
Schneier on Security
WordPress大学
WordPress大学
月光博客
月光博客
C
Cybersecurity and Infrastructure Security Agency CISA
AWS News Blog
AWS News Blog
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
P
Privacy & Cybersecurity Law Blog
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Project Zero
Project Zero
I
Intezer
Know Your Adversary
Know Your Adversary
A
About on SuperTechFans
S
Security Affairs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
P
Proofpoint News Feed
Cloudbric
Cloudbric
V2EX - 技术
V2EX - 技术
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
IT之家
IT之家
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The Last Watchdog
The Last Watchdog
H
Heimdal Security Blog
Schneier on Security
Schneier on Security
Webroot Blog
Webroot Blog
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - Yaopengfei

第五节:Claude Code的用法实操汇总 第十五节:LlamaIndex框架使用2() 第十四节:LlamaIndex框架介绍和入门1(基本用法、提示词、节点等) 第三节:Trae的基本使用 和 Skill的详细用法 第二节:Python基础2 第十三节:FastApi入门以及AI智能体案例落地实操 第二节:GitHub Copilot 用法(基于VSCode/VS、添加DeepSeek/千问等任意模型) 第一节:AI工具总览(Copilot、Cursor、Claude Code、OpenCode、Codex、Trae等) 第一节:Python基础1(数据类型、命名规范、输入输出、运算符、类型转换等) 第十节:预检索-索引优化(摘要、父子、假设问题、元数据、混合索引) 第十二节:MinerU处理复制PDF 和 综合性金融案例实战 第十一节:多检索查询、混合检索(多检索+RRF重排)、检索后优化(文档压缩) 第九节:RAG进阶和Advanced RAG简介 博文阅读密码验证 - 博客园 第七节:LangChain框架Chain链和Agent代理详解 第六节:LangChain框架Model和数据检索详解 第五节:LangChain框架简介和快速入门(模型、模板、解释器、向量、RAG、代理) 第四节:补充pip相关指令大全 第三节:RAG基础(概念、工作流程、文档分块、向量和Embedding、RAG案例等等) 博文阅读密码验证 - 博客园 第一节:Python相关环境安装和配置(Python、PyCharm、Anaconda) 第三十六节:EFCore10.0新增功能和中断性变更 第七节:框架版本大升级(CoreMvc10.x + EFCore10.x) 第五十二节:Core10.0中OpenApi自定义文档(Swagger) 博文阅读密码验证 - 博客园 第二节:如何理解Embedding以及基于内存库简单实操
第三节:C#13、C#14新语法(数字字符串比较、Null分配、扩展成员新写法等等)
Yaopengfei · 2026-01-25 · via 博客园 - Yaopengfei

一. 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://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。