首页 > 编程语言 >Sb5:关于C#扩展方法的理解

Sb5:关于C#扩展方法的理解

时间:2022-10-04 23:48:55浏览次数:71  
标签:静态方法 定义 Sb5 C# 微软 扩展 类型 方法

一直都没有写过扩展方法,但是近期在学习的过程中看到了这个(其实很早之前就看过,没有用到他就一直也没关注)。

那么、什么是扩展方法?扩展方法如何定义,扩展方法如何使用,扩展方法使用注意事项,我们下面从这几方面来说一下。

(说明,本文的知识并不是我独创,我也只是根据学习的东西搬运过来而已,之所以写这么具体,是希望下一个看我文章的朋友能够清晰的了解问题)

1、什么是扩展方法?

这个问题我想先从微软的光网抄一段,“扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种静态方法,但可以像扩展类型上的实例方法一样进行调用。”,从微软官方开发文档来看,扩展方法首先是方法,而且是静态方法,同时他起到的作用应该可派生类中的方法同等作用,但是使用了扩展方法不需要对原类型进行派生。

2、扩展方法如何定义?如何使用扩展方法?

还是从微软官方开发文档来看,扩展方法应该定义在一个静态类中的静态方法。我又从微软官方文档中搬运了一段

  1. 定义包含扩展方法的静态。------------------------------------------------------------------定义一个静态类

    此类必须对客户端代码可见。 有关可访问性规则的详细信息,请参阅访问修饰符

  2. 将扩展方法实现为静态方法,并且使其可见性至少与所在类的可见性相同。--------定义一个静态方法

  3. 此方法的第一个参数指定方法所操作的类型;此参数前面必须加上 this 修饰符。---------这是关键,所定义的静态方法第一个参数必须是this开头,然后是索要扩展的类的对象

  4. 在调用代码中,添加 using 指令,用于指定包含扩展方法类的命名空间

  5. 和调用类型的实例方法那样调用这些方法。

    请注意,第一个参数并不是由调用代码指定,因为它表示要在其上应用运算符的类型,并且编译器已经知道对象的类型。 你只需通过 n 提供形参 2 的实参。

3、扩展方法使用过程中需要注意点什么?

刚接触这个扩展方法,可能觉得这个很牛,然后为了炫技,所以觉得所有的类都可以啥也不干了,将需要做的都放到类外面,使用扩展方法来定义,来实现他。可不可以?我想答案肯定是否定的。首先,我觉得这样去写代码肯定违背了代码的语义性,所编写的代码不符合面向对象的思想了,没有对事物进行封装处理(这只是我个人理解);其次当你对某一个类进行定义扩展方法,那么所有继承这个类的派生类都拥有了这个扩展方法,可能在此就无法保证这个扩展方法的可靠性了,另外如果基类已存在与扩展方法同名方法,那么程序会永远走不到扩展方法体中。其实扩展方法从微软命名就不难看出,他只是一种对原封装类进行的扩展方法,他不能取代类的定义。当我们在联合开发的过程中如果拿到其他同事的封装类,那么我们可以使用扩展方法对这个封装类进行完善。

4、备注

当我们使用扩展方法的时候,最好是在我们的解决方法中定义一个独立的命名空间来存储我们的扩展方法。这样的扩展方法我们就不容易错乱。

 

 

标签:静态方法,定义,Sb5,C#,微软,扩展,类型,方法
From: https://www.cnblogs.com/yjcore/p/16754834.html

相关文章

  • docker 配置 tomcat
     安装tomcatdockerinstall tomcat运行dockertomcatdockerrun -d -p1099:1099-p8080:8080  -v  $(pwd)/webapps:/usr/local/tomcat/webapps/  ......
  • windows 配置 tomcat
    下载地址:https://tomcat.apache.org/,下载后随便放置一个地方 配置环境变量不在赘述、网上太多,自行百度https://blog.csdn.net/haiwei15/article/details/......
  • electron 获取response 拦截所有的返回数据
    electron获取response拦截所有的返回数据注意对性能有所影响main.js中主线程中加入下面的代买import{app,BrowserWindow,shell,ipcMain,Menu,session,Tray,......
  • SV学习(3)——接口interface、modport、时钟块clocking
    SV学习(3)——接口interface、modport、时钟块clocking1.接口interface2.modport3.时钟块clocking3.1.驱动和采用的竞争问题3.2.clocking待补充....=====......
  • idea-配置远程tomcat(docker)
    idea配置tomcat1.1、环境: 本地环境win10: tomcat:10.0.14 环境配置:https://www.cnblogs.com/Mrlu-998/p/16754841.html   ......
  • docker
     dockerupdate--restart=alwaysf8d82e753326docker中启动所有的容器命令dockerstart$(dockerps-a|awk'{print$1}'|tail-n+2)1docker中关闭所有的......
  • 16-RabbitMQ高级特性-消费端的消息ACK与重回队列
    消费端的消息ACK与重回队列消费端的手工ACK和NACKACK分为自动和手动消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿如果由于服务器宕......
  • AtCoder Regular Contest 149(持续更新)
    Preface最近国庆在外面玩的有点high啊,欠了一篇AT和两篇CF没写,今天先浅浅写一下这场当时10.2号在外面玩得有点晚了,到寝室刚好比赛开始,晚饭都没吃就开干了主要是C写的太久......
  • 07-RabbitMQ核心API-Direct Exchange
    DirectExchange简介所有发送到directexchange的消息被转发到Routekey中指定的Queue注意:Direct模式可以使用RabbitMQ自带的Exchange(defaultexchange),所以不需......
  • 08-RabbitMQ核心API-Topic Exchange
    TopicExchange简介所有发送到TopicExchange的消息被转发到所有关心RouteKey中指定Topic的Queue上Exchange将RouteKey和某Topic进行模糊匹配,此时队列需要绑定一个T......