当前位置: 首页 > news >正文

C#21、什么是扩展方法

在 C# 中,扩展方法(Extension Methods) 是一种非常强大的语言特性,它允许你在不修改原始类源码、不继承、不使用装饰器的情况下,为现有的类“添加”新的方法

💡 通俗地说:“给别人的类加功能,就像它是原生的一样!”


✅ 为什么需要扩展方法?

假设你经常对 string 做“判断是否为空或只包含空白字符”的操作:

if (string.IsNullOrEmpty(input) || string.IsNullOrWhiteSpace(input))

这段代码又长又难记。如果能像这样调用就好了:

if (input.IsNullOrBlank())

string 是 .NET 内置类,你不能直接修改它的源码。
👉 扩展方法就是解决这个问题的!


✅ 如何定义扩展方法?

必须满足 3 个条件

  1. 定义在一个 static
  2. 方法本身是 static
  3. 第一个参数使用 this 关键字 + 要扩展的类型

🔧 语法模板:

public static class 扩展类名
{public static 返回类型 方法名(this 被扩展的类型 参数名, 其他参数...){// 实现逻辑}
}

✅ 实战示例:给 string 添加 IsNullOrBlank()

// 1. 创建静态类(通常命名为 XxxExtensions)
public static class StringExtensions
{// 2. 静态方法 + this stringpublic static bool IsNullOrBlank(this string str){return string.IsNullOrWhiteSpace(str);}
}

使用方式(像原生方法一样!):

string input = "   ";
if (input.IsNullOrBlank())
{Console.WriteLine("输入为空或全是空格");
}

✅ 调用时不需要写类名,直接 变量.方法名()


✅ 扩展方法的本质

  • 编译器会把 input.IsNullOrBlank() 自动转换成
    StringExtensions.IsNullOrBlank(input)
    
  • 所以它不是真正的“添加方法”,而是一种语法糖
  • 但它让代码看起来更自然、更面向对象。

✅ 常见使用场景

1. 为内置类型添加实用方法

public static class DateTimeExtensions
{public static bool IsWeekend(this DateTime date){return date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday;}
}// 使用
if (DateTime.Now.IsWeekend()) { ... }

2. 简化 LINQ 或集合操作

public static class ListExtensions
{public static void ForEach<T>(this IEnumerable<T> source, Action<T> action){foreach (T item in source) action(item);}
}// 使用(虽然 .NET 已有,但这是经典例子)
numbers.ForEach(n => Console.WriteLine(n));

3. Fluent 链式调用(构建器模式)

public static class StringBuilderExtensions
{public static StringBuilder AppendLineIf(this StringBuilder sb, bool condition, string value){if (condition) sb.AppendLine(value);return sb; // 支持链式调用}
}// 使用
var sb = new StringBuilder();
sb.AppendLineIf(!string.IsNullOrEmpty(name), $"Name: {name}").AppendLineIf(age > 0, $"Age: {age}");

4. 为接口提供默认实现(C# 8 之前常用)

public static class ILoggerExtensions
{public static void LogInfo(this ILogger logger, string message){logger.Log(LogLevel.Info, message);}
}

⚠️ 重要规则与限制

规则说明
只能访问被扩展类型的公有成员无法访问 private 字段或方法
优先级低于实例方法如果类本身有同名方法,会优先调用实例方法
需要引入命名空间必须 using 扩展方法所在的命名空间才能使用
不能重写(override)只是静态方法,不参与多态

🆚 扩展方法 vs 继承 vs 工具类

方式优点缺点适用场景
扩展方法无需修改原类,调用简洁不能访问私有成员为 sealed 类、第三方类、接口添加功能
继承可重写、可访问 protected 成员不能继承 sealed 类,破坏封装你能控制基类,且符合“is-a”关系
工具类(静态方法)简单直接调用不直观(需写类名)不需要“看起来像实例方法”的场景

扩展方法最适合:给不能改的类(如 string, int, 第三方库类)加功能。


💡 最佳实践建议

  1. 命名规范:扩展类命名为 XxxExtensions(如 StringExtensions
  2. 放在合理命名空间:通常和被扩展类型在同一命名空间,或单独建 Extensions 目录
  3. 不要滥用:只添加真正通用、有意义的方法
  4. 避免与未来版本冲突:比如 .NET 可能以后给 stringIsNullOrBlank,你的扩展会被隐藏

✅ .NET 内置的经典扩展方法

其实你每天都在用扩展方法,只是没注意!

  • LINQ 的所有方法都是扩展方法!
    list.Where(x => x > 0)   // Where 是 IEnumerable<T> 的扩展方法.Select(x => x * 2).ToList();
    
  • 它们定义在 System.Linq.Enumerable 静态类中。

✅ 小结

特点说明
作用为现有类型“添加”新方法
定义要求static class + static method + this T 第一个参数
调用方式像实例方法一样:obj.Method()
典型用途工具方法、LINQ、Fluent API

🧠 一句话记住
“扩展方法 = 给别人的类写‘伪实例方法’。”


问题

如何在不修改现有类的情况下向其添加新功能?

通过使用扩展方法

如果调用与现有扩展方法具有相同签名的成员方法会发生什么?

成员方法具有优先级,它将被调用。

http://www.dtcms.com/a/619344.html

相关文章:

  • ps模板网站苏州城乡建设局的网站首页
  • idc 公司网站模板网站开发报价单模板
  • 大模型-vllm如何部署新模型-2
  • 我编辑好了一个urdf文件,但是我怕有什么错误,有什么可以用于调试或者发现urdf文件错误的命令行工具吗
  • 外贸公司网站有哪些西安市建设工程信息网平台
  • 中英文网站切换建设银行扬中网站
  • Java Faker库详解
  • 用七牛做网站定制化网站开发的好处
  • 荆门做网站北京网站备案注销中心
  • 著名建站公司哈尔滨市工程建设招投标网
  • 第三方软件验收测试报告有哪些测试内容?多少钱才算合适?
  • 松江品划网站建设推广宿州建设银行网站
  • 昆明网站建设网站建设视觉传播设计与制作专业
  • 软件常用运行库丨去游戏组件
  • 超市如何建立网站产品推广介绍怎么写
  • 网站建设品牌排行榜湘潭做网站口碑好磐石网络
  • 十大设计创意产品网站青岛网站建设seo优化
  • 仿制网站侵权吗网站开发流程的认识
  • Vue Vue与VueComponent的关系
  • 精益求精,支持处理嵌套表格的Word表格转HTML表格
  • 网站推广是什么意思大连建设网水电费查询网址
  • 海丰网站建设中国台州网
  • 关于设计图的网站wordpress优化教程
  • 西安网站建设培训光伏项目建设背景
  • 做饲料机械的网站小挑可以做网站吗
  • 我想做网站怎么做ps做网站首页的尺寸
  • 综合实训-03
  • app推广的网站马来西亚的网站后缀
  • 网站留言效果怎么做淘宝客网站模板
  • 13.【Linux系统编程】从ELF格式深入理解动静态库