扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开

重点如下:
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

虽然扩展方法通过实例方法语法进行调用的,但是他们却被定义为静态方法。从定义中我们可以看到,它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

扩展方法与其扩展的类之间并没有什么本质的联系,只是编译器跟我们玩的把戏罢了,最终编译器还是将扩展方法转化成静态类的静态方法调用,所以扩展方法不能访问相应类的私有字段和私有方法;至于为什么使用静态类的静态方法,我考虑可能是这样效率相对较高,同时扩展方法作为其他类的扩展,本身类的实例化没有什么意义.

综上进行总结
扩展方法不改变被扩展类的代码,不用重新编译、修改、派生被扩展类
扩展方法不能访问被扩展类的私有成员
扩展方法会被被扩展类的同名方法覆盖,所以实现扩展方法我们需要承担随时被覆盖的风险
扩展方法看似实现了面向对象中扩展对修改说不的特性,但是也违背了面向对象的继承原则,被扩展类的派生类是不能继承扩展扩展方法的,从而又违背了面向对象的多态性。
在我们稳定的引用同一个版本的类库,但是我们没有该类库的源代码,那么我们可以使用扩展方法;但是从项目的可扩展、可维护和版本控制方面来说,都不建议使用扩展方法进行类的扩展。

************************************************************************************

那么现在谈谈我对扩展方法的理解:

我认为扩展方法是对现实世界一种常见范式的模拟,这种方式违背了面向对象的一些基本原则,但是这也是C#走向动态语言的一大步。

本质上来说: 扩展方法是破坏原来的层次结构,通过网络结构加快业务逻辑处理.

举例来说:

public class 手电筒

{

public void 照射()

}

村里的老刘是个电子爱好者,他从商场购买的手电筒只能照射用,他买回来改装后,这手电筒还能做喇叭用,他将改装的手电筒在村里卖。

public static class 改装室  //扩展方法实现

{

public static void 喇叭叫(this 手电筒 手电筒1)

{ }

}

public class 新手电筒: 手电筒  //继承实现

{

public void 喇叭叫(){}

}

村里不少人都买了,他们拿着手电筒,知道这个手电筒不仅能照射,还能喇叭叫

手电筒1.照射()

手电筒1.喇叭叫()

这种方式扩展和继承都能实现,但是在使用时,继承方式引入了新的变量体,可以认为继承会使得调用时,整个事务逻辑更复杂。

当我们确定先前的手电筒被完全密封不可见时,继承方式更适合,而当手电筒一直可见时,使用扩展方法可以减少一个新类的概念体。

对于.NET中一些常见类,String,Dictionary,List,Random

我们可能都会对他们进行一些特殊的调用,一般情况下,

我们可能会用继承:StringME,DictionaryME,ListME,RandomME

也可能直接调用对象: ME.str(String sone),ME.dic(Dictionary<>  done),ME.str(List<> lone)

上面的两种方式都意味着你不仅需要知道String,Dictionary,List,Random,还需要知道新的StringME,DictionaryME,ListME,RandomME或者ME.str(String sone),ME.dic(Dictionary<>  done),ME.str(List<> lone).

从事务逻辑说: 每次处理时需要处理的信息量已经增大一倍。

而如果我们使用扩展方法后,通过String,Dictionary,List,Random的实例对象,即可调用。这降低了处理一个问题时所需要汇聚的信息量,所以回归到整个问题的本质,扩展方式的优势使得我们处理一些问题时能消耗更少的注意力。但是扩展方法可能和原来的方法以及继承类有冲突,存在调用的安全性问题,所以大项目一般不会采用。而小项目则可以快速开发应用。

更多的应用见c# 扩展方法奇思妙用

C#扩展方法学习的更多相关文章

  1. C#3.0扩展方法学习篇

     什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...

  2. C#扩展方法学习笔记

    C#扩展方法,简单的理解是不修改原来类的源代码的情况下,为某个类添加某个方法.扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.它们的第一个参数指定该方法作用于哪个类型,并且该参数以 th ...

  3. C#的扩展方法学习

    一,什么是扩展方法? 1,扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 2,扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用 ...

  4. C#学习笔记(八):扩展方法

    还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只).好了不多说了,今天来学习一下C#的这个特性——扩展方法. 扩展方 ...

  5. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

  6. 扩展方法以及LinQ的学习

    我们今天学习的内容其实还是蛮多的,学习了自动属性,扩展方法,复习初始化器,以及LinQ的一些方法,其实感觉有些还是很熟悉的,在前面的学习过程中有时间感觉学习的知识知道了怎么使用,但是还没有在项目中使用 ...

  7. JavaScript学习总结(十四)——JavaScript编写类的扩展方法

    在​J​a​v​a​S​c​r​i​p​t​中​可以使​用​类的p​r​o​t​o​t​y​p​e属性来​扩​展​类的属​性​和​方​法,在实际开发当中,当JavaScript内置的那些类所提供的动态 ...

  8. C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

  9. ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

    一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...

随机推荐

  1. Eclipse中git插件导入远程库和上传项目源代码到远程库

    陆陆续续,从github,csdn的code.之前实习的小公司也是用git管理.发如今版本号控制方面确实比較方便.代码一敲完 . 自己由于完毕了新功能.加入一个新分支.然后提交上去,这就是程序猿一天干 ...

  2. vue 获取当前时间 格式YYYY-MM-DD

    函数封装: /** * 获取当前时间 * 格式YYYY-MM-DD */ Vue.prototype.getNowFormatDate = function() { var date = new Da ...

  3. Android中个人推崇的数据库使用方式

    手机应用开发中常常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库.在上层进行了一层封装,同一时候还为我们提供了ContentProvider的框架.方便我们进 ...

  4. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  5. C#结构类型图

    C#结构类型图     分类: C#

  6. Django的各种初识

    1,django项目的各个文件的介绍 1.1>项目的根目录:是各个子文件的根目录,在各个文件相互导入文件的时候使用 1.2>配置文件:为django的各个文件配置相关的各种默认配置 1.3 ...

  7. ISA总线

    ISA总线: (Industry Standard Architecture:工业标准体系结构)是为PC/AT电脑而制定的总线标准,为16位体系结构,只能支持16位的I/O设备,数据传输率大约是16M ...

  8. YTU 2896: J--Zipper

    2896: J--Zipper 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 15 题目描述 Given three strings, you are to determ ...

  9. silverlight子窗体操作数据库后刷新父窗体

    silverlight子窗体操作数据库后刷新父窗体 作者 Kant 写于 2011 年 07 月 02 日 分类目录 学习笔记, 所有文章 C# Silverlight 代码 刷新 学习 异步刷新 数 ...

  10. lucene segment会包含所有的索引文件,如tim tip等,可以认为是mini的独立索引

    A Lucene index segment can be viewed as a "mini" index or a shard. Each segment is a colle ...