跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 扩展方法
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#扩展方法 = == 介绍 == '''扩展方法'''是C# 3.0引入的一项强大特性,它允许开发者在不修改原始类定义的情况下,为现有类型添加新的方法。这些方法看起来像是类的原生方法,但实际上是在类外部定义的静态方法。扩展方法的主要目的是增强代码的可读性和灵活性,同时避免继承或修改现有代码库。 扩展方法的关键特点: * 必须定义在静态类中 * 必须是静态方法 * 第一个参数使用<code>this</code>关键字修饰,表示要扩展的类型 * 调用时不需要传递第一个参数(由编译器自动处理) == 语法基础 == 扩展方法的基本语法结构如下: <syntaxhighlight lang="csharp"> public static class ExtensionMethods { public static ReturnType MethodName(this TypeToExtend target, [其他参数]) { // 方法实现 } } </syntaxhighlight> === 简单示例 === 下面是一个为<code>string</code>类型添加扩展方法的例子: <syntaxhighlight lang="csharp"> public static class StringExtensions { public static bool IsNullOrEmpty(this string str) { return string.IsNullOrEmpty(str); } } // 使用示例 string testString = ""; bool result = testString.IsNullOrEmpty(); // 返回true </syntaxhighlight> == 工作原理 == 扩展方法是通过编译器转换实现的语法糖。当编译器遇到扩展方法调用时,它会将其转换为对静态方法的普通调用。 例如: <syntaxhighlight lang="csharp"> // 这样调用扩展方法 testString.IsNullOrEmpty(); // 实际上被编译为 StringExtensions.IsNullOrEmpty(testString); </syntaxhighlight> <mermaid> graph LR A[调用扩展方法 obj.ExtensionMethod()] --> B[编译器查找匹配的静态类] B --> C[找到包含this参数的静态方法] C --> D[转换为静态方法调用 StaticClass.ExtensionMethod(obj)] </mermaid> == 实际应用案例 == === 集合操作扩展 === LINQ就是基于扩展方法构建的经典案例。我们也可以创建自己的集合扩展: <syntaxhighlight lang="csharp"> public static class CollectionExtensions { public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items) { foreach (var item in items) { collection.Add(item); } } } // 使用示例 List<int> numbers = new List<int> { 1, 2, 3 }; numbers.AddRange(new[] { 4, 5, 6 }); // 现在numbers包含1-6 </syntaxhighlight> === 数值处理扩展 === 为数值类型添加有用的计算方法: <syntaxhighlight lang="csharp"> public static class NumericExtensions { public static bool IsBetween(this int value, int min, int max) { return value >= min && value <= max; } public static double ToRadians(this double degrees) { return degrees * Math.PI / 180.0; } } // 使用示例 int age = 25; bool isAdult = age.IsBetween(18, 65); // true double angle = 90.0; double radians = angle.ToRadians(); // 1.5707963267948966 </syntaxhighlight> == 高级主题 == === 扩展方法与继承 === 扩展方法遵循以下解析规则: 1. 实例方法优先于扩展方法 2. 当多个扩展方法同名时,选择最具体的类型匹配 3. 命名空间中的扩展方法需要先导入 === 泛型扩展方法 === 可以为泛型类型创建扩展方法: <syntaxhighlight lang="csharp"> public static class GenericExtensions { public static T Max<T>(this IEnumerable<T> source) where T : IComparable<T> { if (!source.Any()) throw new InvalidOperationException("序列为空"); T max = source.First(); foreach (T item in source) { if (item.CompareTo(max) > 0) max = item; } return max; } } // 使用示例 List<int> numbers = new List<int> { 3, 1, 4, 1, 5, 9 }; int maxNumber = numbers.Max(); // 9 </syntaxhighlight> === 扩展接口 === 可以为接口定义扩展方法,这样所有实现该接口的类都能使用这个方法: <syntaxhighlight lang="csharp"> public static class InterfaceExtensions { public static void Log(this ILogger logger, string message, LogLevel level) { logger.Log($"[{level}] {DateTime.Now}: {message}"); } } public interface ILogger { void Log(string message); } // 任何实现ILogger的类现在都有Log(message, level)方法 </syntaxhighlight> == 最佳实践 == 1. '''谨慎使用''':只在确实需要增强现有类型功能时使用,避免过度使用 2. '''命名空间''':将扩展方法放在专门的命名空间中,需要时再导入 3. '''命名约定''':扩展方法类通常以"Extensions"后缀命名 4. '''文档注释''':为扩展方法提供完整的XML文档注释 5. '''性能考虑''':避免在频繁调用的热路径中使用复杂的扩展方法 == 限制与注意事项 == * 不能扩展静态类 * 不能覆盖现有方法 * 扩展属性(使用get/set方法模拟) * 扩展方法在动态代码(dynamic)中不可用 * 优先级低于实例方法 == 数学扩展示例 == 使用<math>标签展示数学相关的扩展方法: <math>e^{i\pi} + 1 = 0</math> <syntaxhighlight lang="csharp"> public static class MathExtensions { public static double StandardDeviation(this IEnumerable<double> values) { double avg = values.Average(); double sumOfSquares = values.Sum(v => Math.Pow(v - avg, 2)); return Math.Sqrt(sumOfSquares / (values.Count() - 1)); } } // 使用示例 double[] data = { 1.2, 2.3, 3.4, 4.5 }; double stdDev = data.StandardDeviation(); </syntaxhighlight> == 总结 == C#扩展方法是一种强大的语言特性,它允许开发者以优雅的方式扩展现有类型的功能,而无需修改原始代码或创建派生类。通过合理使用扩展方法,可以提高代码的可读性和可维护性,同时保持类型系统的整洁性。 关键要点: * 扩展方法是静态方法,但可以像实例方法一样调用 * 使用<code>this</code>关键字标记要扩展的类型 * 在专门的静态类中定义扩展方法 * 遵循良好的命名和组织规范 * 了解其限制和适用场景 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 高级类特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)