扩展方法的快速理解

---恢复内容开始---

今天记录一下自己对扩展方法的理解,扩展方法就是实现某种功能但是在原有的类或程序集中又不存在这种功能实现的方法或者封装,继而衍生出扩展方法。但是新建一个类来封装实现这种功能的方法也可以达到目的而且使用继承机制也可以实现,为何有衍生扩展方法呢?

  1. 第一种方式是比较通用的一种方式,也是通常情况下使用最多的,但和扩展方法比较来说,代码的可读性不如扩展方法。
  2. 继承的方式是一个很好的扩展方案,但有时不一定是完美的,比如:a. 每次继承都会产生新类,且使用时需要进行相应的强制转换(string=>MyString),b. 有些类本身设计为密封类,是不允许被继承的,如上所使用的例子string是不允许被继承的,所以第二种方案是不可行的。这时,第三种方案扩展方法就派上用场了。

所以扩展方法登场可以完美的解决以上两种机制所产生或者遗留的问题和不足,进一步了解扩展方法的用法吧!

声明扩展方法必须符合以下特性:

  1. 该方法必须声明在静态类中且方法类型为静态方法
  2. 方法的第一个参数类型是可扩展的类型
  3. 第一个参数需加this关键字

写个demo来看看:

namespace zhengze
{
    public static class Myarr
    {
        public static int GetAdd(this int[] arr)
        {
            int max = 0;
            for (int i = 0; i < arr.Length; i++)
            {
                max += arr[i];
            }
            return max;
        }
    }
}

然后调用方式:

namespace zhengze
{
    class Program
    {
        public static void Main(string[] args)
        {

            int[] arr = {1,3,5,7 };

            Console.WriteLine(arr.GetAdd());
        }
    }
}

这样我的一个简单的扩展方法就完成了。如何识别一个扩展方法:

  1. 第一个参数类型为this的方法
  2. 方法图标标有下标箭头

以上内容有部分来自于园友http://home.cnblogs.com/u/codelir/博客。本章内容只是供自己理解复习加深记忆,有不足的地方请指出!---献给第二次的自己

---恢复内容结束---

时间: 2024-10-19 19:58:02

扩展方法的快速理解的相关文章

关于扩展方法

下面是我自己对于可扩展方法的一点理解.本人纯属小白,如果写得不对的地方,请大家指出.代码如下: namespace test{    public static class MyExtention    {        public static int WordCount(this string str)        {            int num = str.Split(',').Length;            return num;        }    }} 扩展方

JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)

理解$.extend(),与$.fn.extend()方法区别 1.$.extend()方法 $.extend()方法在JQuery中有两个用法,第一次是扩展方法, 第二个方法是 jQuery.extend([deep], target, object1, [objectN]) 返回值:Object 把2个对象合并得到新的target,deep是可选的(递归合并) 合并 settings 和 options,修改并返回 settings. jQuery 代码: var settings = {

扩展方法的理解(个人愚见)

在 aspx 中由于没有用到服务器控件,就没有 __VIEWSTATE 这个asp.net产生的 隐藏域 保存在浏览器(客户端),IsPostBack 就无法使用了.但又要判断是否用户请求了页面,但又因 IsPostBack 无法使用了,这时我们是不是考虑自己手写一个方法~ 由于会有多个页面会用到 IsPostBack 方法,这时就考虑封装. 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例

C#扩展方法的理解

“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码. 先做个例子吧,以String为例,需要在字符串类型中加一个从字符串转为数值的功能. 以往我们可能是这样做的,会专门写一个方法做过转换 public static int StrToInt(string s) {     int

C#扩展方法学习

扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开 重点如下:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 虽然扩展方法通过实例方法语法进行调用的,但是他们却被定义为静态方法.从定义中我们可以看到,它们的第一个参数指定该方法作用于哪个类型,

C#的扩展方法解析

在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

C#中的扩展方法

在java中没有这样的东西,一个类一旦是 final的 ,这个类就不能再被添加方法, 但是C#能够做到,可以给 sealed 类添加新的方法,这点我还是比较喜欢c#的. 这就是C#中的扩展方法. 那么什么情况下我们才需要去给一个类写扩展方法呢? 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承:(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不

Linq入门——什么是linq &amp; 扩展方法

一,什么是Linq linq(language integrated Query):语言集成查询: linq包含如下: 对对象的查询,对数据库的查询,对XML的查询. 那么,没有linq前我们是怎样查询的? 先看一个例子: 现在我们要查询大于50的数,: 在没有linq之前,我们的代码时这样的: 使用了linq查询: 首先,从直观上看,代码更加简洁,其次,对于查询部分,接近SQL语句,层次清晰,容易理解: 除了简单高效以为,LINQ的出现解决了很多问题: 1,面向对象与数据访问两个领域长期分裂,

来看看两种好玩的方法,扩展方法和分布方法

好久没过来扯淡了,话说这年头还有偶遇的事情吗?比如国庆回家的汽车上有个妹子要你qq,要你微信,想着法子跟你聊天,然后睡了一觉,醒来发现 肾不见了?小花絮小花絮,要是肾真没了,也吹不了牛,败不了火了,继续言归正传. 一:扩展方法 说到扩展方法,我想大家都已经再熟悉不过了,也许你的解决方案中有无数个这样的扩展方法,自从有了Linq之后,我们的集合就再也不单纯了. 从下面的Linq类中,所有的方法都扩展在IEnumerable<T>上,恰恰我们的集合都继承于IEnumerable接口下面. 然后我们