C# 扩展方法只会写 this 吗?C# 14 新语法直接把扩展方法玩出了花
从静态方法到扩展块#传统的扩展方法需要每个方法都重复写this参数且只能扩展方法。新语法通过extension关键字定义一个块将目标类型集中声明。传统写法是这样的public static class StringExtensions { // 每个方法都要写一遍 (this string str) public static bool IsValidEmail(this string str) str.Contains(); public static string ToTitleCase(this string str) ...; }新语法C# 14 / .NET 10public static class MyExtensions { // 定义一个针对 string 的扩展块str 是接收者名称 extension(string str) { // 1. 扩展属性 (以前做不到) public bool IsValidEmail str.Contains(); // 2. 扩展方法 (不再需要写 static 和 this) public string ToTitleCase() char.ToUpper(str[0]) str.Substring(1); } }新语法支持的成员类型#这是 .NET 10 最强大的地方扩展的能力范围极大地拓宽了成员类型是否支持示例语法实例方法是public void M() ...实例属性是public int Length str.Length;静态方法是public static void Help() ...静态属性是public static string Default None;运算符重载是public static bool operator (string a, MyType b)索引器是public char this[int i] str[i];静态扩展成员#以前我们无法给一个现有的类比如DateTime或int添加静态工具方法现在可以了。public static class DateTimeExtensions { // 注意括号内只有类型没有实例名称表示静态扩展 extension(DateTime) { public static DateTime Tomorrow DateTime.Now.AddDays(1); } } // 使用时 var nextDay DateTime.Tomorrow; // 就像 DateTime 原生自带的一样泛型支持#新语法对泛型的支持非常优雅尤其是在处理集合LINQ 风格时public static class EnumerableExtensions { extensionT(IEnumerableT source) { // 扩展属性判断集合是否为空 public bool IsEmpty !source.Any(); // 扩展方法 public void ForEach(ActionT action) { foreach (var item in source) action(item); } } }实际代码#既然说到是给 StarBlog 写的脚本那我也把实际用到的代码放出来吧水字数bushi实际上是一个提取 markdown 二级标题下段落的扩展方法public static class MyExtensions { extension(Post post) { public string GetSection(string title) { return ExtractSectionRegex(post.Content, title); } public Dictionarystring, string GetSections(params string[] titles) { var dict new Dictionarystring, string(); foreach (var title in titles) { dict.Add(title, post.GetSection(title)); } return dict; } } private static string ExtractSectionRegex(string content, string title) { // 匹配目标标题开始直到下一个标题或文档末尾 string pattern $##\s*{title}\s*([\s\S]*?)(?\n##|$); var match Regex.Match(content, pattern); return match.Success ? match.Groups[1].Value.Trim() : string.Empty; } }实际上这个GetSections方法又可以用 LINQ 语法简化一下public Dictionarystring, string GetSections(params string[] titles) { return titles.ToDictionary(title title, title post.GetSection(title)); }再用 method group 简化一下最终效果public Dictionarystring, string GetSections(params string[] titles) { return titles.ToDictionary(title title, post.GetSection); }翻译翻译什么叫优雅小结#新的扩展语法糖还是很甜的在我看来有几个优势代码更自然扩展属性让 API 看起来更像目标类型的原生一部分而不是非要调用一个带括号的方法。逻辑集中在一个extension块里定义所有相关的扩展代码结构比散落在静态类里的方法更清晰。零破坏性新语法与旧的this扩展方法语法完全兼容可以根据喜好混合使用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2466155.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!