news 2026/6/23 17:13:52

20251215_WPF入门之拓展方法_Study09

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
20251215_WPF入门之拓展方法_Study09

文章目录

  • 一.、拓展方法概念
  • 二、拓展方法定义
  • 三、拓展方法使用
  • 四、拓展方法具体示例:
  • 五、拓展方法原则总结
  • 六、注意事项

一.、拓展方法概念

  • 拓展方法允许你向现有的类型(包括 .NET Framework 中的类型或你引用的第三方库中的类型)"添加"新的方法,而无需修改原始类型的源代码、创建新的派生类型或使用继承。它提供了一种在类外部扩展类功能的途径。
  • 本质上,拓展方法是一种特殊的静态方法,但调用语法看起来就像是该类型本身的实例方法一样。

二、拓展方法定义

定义拓展方法需要满足以下条件:

  • 静态类: 方法必须定义在一个静态类中。
  • 静态方法: 方法本身必须是静态的。
  • 修饰符: 方法的第一个参数必须使用this关键字修饰,该参数的类型指定了扩展的类型。示例如下:
namespaceExtensionMethods.Extensions{publicstaticclassExtensionMethods{publicstaticboolisGreatThan(thisinti,intj){returni>j;}}}

该代码定义了一个在静态类ExtensionMethods中的返回值为布尔类型、拓展类型为int类型、并需要传入另一个int类型的参数进行比较的拓展方法,若拓展类型的数据值大于传入数据的值,则返回true

三、拓展方法使用

一旦定义了拓展方法并在其命名空间可见(通常需要添加using指令引入包含该静态类的命名空间),就可以像调用该类型的普通实例方法一样使用它,示例如下:

usingExtensionMethods.Extensions;classProgram{staticvoidMain(){inti=100;boolresult=i.isGreatThan(99);Console.WriteLine(result.ToString());}}

四、拓展方法具体示例:

publicstaticclassListExtensions{publicstaticdoubleMidiumNum(thisList<int>numbers){if(numbers==null||numbers.Count==0){thrownewArgumentException("列表为空或为null");}numbers.Sort();intsize=numbers.Count;intmid=size/2;if(size%2!=0)// 奇数个{returnnumbers[mid];}else// 偶数个{return(numbers[mid-1]+numbers[mid])/2.0;}}}

使用:

List<int>data=newList<int>{1,3,5,2,4};doublemidiumValue=data.MidiumNum();Console.WriteLine(midiumValue);// 输出: 3

五、拓展方法原则总结

  • C#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等。
  • 扩展方法必须在非泛型的静态类中声明,扩展方法必须有一个参数,而且只有第一个参数使用this标记。
  • C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。
  • C#编译要求“导入”扩展方法。(静态方法可以任意命名,C#编译器在寻找方法时,需要花费时间进行查找,需要检查文件作用域中的所有的静态类,并扫描它们的所有静态方法来查找一个匹配)
  • 多个静态类可以定义相同的扩展方法。
  • 用一个扩展方法扩展一个类型时,同时也扩展了派生类型。

六、注意事项

  1. 优先级: 如果类型本身已经有一个签名相同的方法(同名且参数兼容),实例方法总是优先于拓展方法被调用。
  2. 命名空间可见性: 拓展方法仅在包含其静态类的命名空间可见。使用时需要using相应的命名空间。
  3. 无法访问私有成员: 拓展方法只能访问目标类型的公共成员(字段、属性、方法等),就像该类型的其他外部代码一样。它不能访问私有或受保护的成员。
  4. 空引用问题: 在拓展方法内部,如果this参数(即调用实例)是null,仍然可以访问它(因为它是静态方法的一个参数),但试图访问该实例的成员会导致NullReferenceException。方法内部应自行处理null的情况。
  5. 谨慎使用: 过度使用拓展方法可能导致代码难以理解和维护,特别是当它们掩盖了类型本身的功能或与未来的框架更新冲突时。优先考虑使用继承、组合或修改原始代码来添加功能。
  6. 编译时静态绑定: 拓展方法的调用是在编译时根据变量的静态类型解析的,而不是运行时对象的实际类型。这与虚方法调用不同。
  7. 无法为接口定义默认实现: 在C# 8.0之前,无法直接为接口定义拓展方法作为默认实现。C#8.0引入了接口的默认实现(也称为接口成员实现),这是不同的概念。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:53:15

Pelco KBD300A 模拟器:05+1.本项目中的链式调用类设计详解

第51篇&#xff1a;Pelco KBD300A 模拟器:本项目中的链式调用类设计详解 —— 优雅、可读、零冗余的 Pelco 协议指令构建方式 在 Pelco KBD300A 模拟器开发过程中&#xff0c;为了让指令发送代码更简洁、直观、易维护&#xff0c;我们引入了**链式调用&#xff08;Method Cha…

作者头像 李华
网站建设 2026/6/23 18:51:14

基于springboot + vue考勤管理系统

考勤管理 目录 基于springboot vue考勤管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue考勤管理系统 一、前言 博主介绍&am…

作者头像 李华
网站建设 2026/6/23 4:44:19

基于springboot + vue图书借阅管理系统

图书借阅 目录 基于springboot vue图书借阅管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue图书借阅管理系统 一、前言 博主…

作者头像 李华
网站建设 2026/6/23 4:10:03

淘宝天猫一键重装系统工具,智能装机助手,支持多版本系统傻瓜式安装,新手小白也能轻松上手!

温馨提示&#xff1a;文末有联系方式全能一键重装系统工具&#xff0c;专为新手打造这款专为淘宝、天猫用户设计的一键重装系统软件&#xff0c;又被称为“天猫装机助手”&#xff0c;是一款高效便捷的装机工具。 采用傻瓜式操作界面&#xff0c;即便是毫无电脑基础的小白用户&…

作者头像 李华
网站建设 2026/6/22 16:44:57

仿生记忆革命:字节跳动AHN技术突破大模型长文本处理瓶颈

仿生记忆革命&#xff1a;字节跳动AHN技术突破大模型长文本处理瓶颈 【免费下载链接】AHN-DN-for-Qwen-2.5-Instruct-14B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/AHN-DN-for-Qwen-2.5-Instruct-14B 导语 字节跳动推出的人工海马体网络&#xff…

作者头像 李华
网站建设 2026/6/23 11:44:22

云服务器新手必看:常见名词和知识整理,一文搞懂

第一次购买云服务器&#xff0c;面对控制台里一堆术语&#xff0c;很容易一头雾水。 内存、带宽、系统盘、按流量计费……这些词到底什么意思&#xff1f; 选错一项&#xff0c;可能多花钱&#xff0c;甚至影响网站运行。 今天我们就结合国内主流云厂商选择界面&#xff0c; 用…

作者头像 李华