C#4.0语法糖之第四篇: 扩展方法

    今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法。大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做。我先说一下我没有学习到这个知识点之前做的方法:

最笨的办法就是修改原来的类型,然后添加一个方法来达到需求的变更,如下代码所示:

  

 1 public  class KuozFF
 2
 3     {
 4
 5         public void NormalMethod()
 6
 7         {
 8
 9             Console.WriteLine("我是原始方法");
10
11         }
12
13 public void ExtensionMethod()
14
15         {
16
17             Console.WriteLine("我是扩展方法");
18
19         }
20
21     }

调用方法:

1 KuozFF method=new KuozFF ();
2
3             method.NormalMethod();
4
5             method.ExtensionMethod();
6
7             Console.ReadLine();

输出效果如下:

但是比如说别人给你的是一个dll文件,你没有办法修改,但是你想在该类中添加你的方法怎么办?

自己写一个类,然后该类继承自原始类,代码如下:

 1 public  class KuozFF
 2
 3     {
 4
 5         public void NormalMethod()
 6
 7         {
 8
 9             Console.WriteLine("我是原始方法");
10
11         }
12
13
14
15     }
16
17
18
19     public class MYKZFF : KuozFF
20
21     {
22
23         public void ExtensionMethod()
24
25         {
26
27             Console.WriteLine("我是扩展方法");
28
29         }
30
31     }

调用代码如下:

1 MYKZFF method=new MYKZFF();
2
3             method.NormalMethod();
4
5             method.ExtensionMethod();
6
7             Console.ReadLine();

效果如下:

  以上结果可以看出效果是一样的,但是有的人他不想写继承类,也不想修改源代码怎么办?这时候就扩展方法诞生了!我先看看官方解释吧:

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

这是微软MSN上的解释,我们直接看代码,扩展方法是长什么样吧:

 1 public class KuozFF
 2
 3     {
 4
 5         public void NormalMethod()
 6
 7         {
 8
 9             Console.WriteLine("我是原始方法");
10
11         }
12
13
14
15     }
16
17
18
19     public static class ExtensionClass
20
21     {
22
23         public static void ExtensionMethod(this KuozFF k)
24
25         {
26
27             Console.WriteLine("我是扩展方法");
28
29         }
30
31     }

调用代码如下:

1 KuozFF method=new KuozFF();
2
3             method.NormalMethod();
4
5             method.ExtensionMethod();
6
7             Console.ReadLine();

输出结果:

从上面代码可以看出我们客户端调用时无需关心扩展方法在哪儿写的,你只要实例化原始类,扩展方法自动会有的。

扩展方法在C#4.0中是无处不在的,下面我们看看C#内置的扩展方法来更深刻的了解一下:

 1 public static class Enumerable
 2
 3   {
 4
 5     public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
 6
 7     public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);
 8
 9     public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
10
11     public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);
12
13 }

以上就是微软IEnumerable类的扩展方法,所以我们平时用的时候方法后面点.后就能出来怎么多丰富的where,select等方法是扩展方法起的作用。这里只是拿出一点扩展方法来展示了一下。

下面我们写一下string类扩展方法,我们以前判断一个字符串是否null或空时,用系统内置方法string. IsNullOrEmpty(s),我们把这个方法做成扩展方法演示一下:

 1  public static class Demo1
 2
 3     {
 4
 5         public static bool IsNullOrEmpty(this string s)
 6
 7         {
 8
 9             return string.IsNullOrEmpty(s);
10
11         }
12
13     }

调用代码如下:

1     string temp = "12";
2
3             bool result = temp.IsNullOrEmpty();
4
5             Console.WriteLine(result);
6
7             Console.ReadLine();

输出结果:

从调用代码可以看出string本身是没有IsNullOrEmpty()方法的,通过我们自己写扩展方法有了该方法。

大家可以在自己的方法或者对系统类的扩展可以写一下,以便在日后的编码过程中给自己提供方便。

今天就写到这里吧!谢谢朋友们的支持!

C#4.0语法糖之第四篇: 扩展方法

时间: 2024-11-10 01:23:08

C#4.0语法糖之第四篇: 扩展方法的相关文章

C#4.0语法糖之第五篇: 匿名类 &amp; 匿名方法

今天时间有点早,所以上来在写一篇文章吧,继续上一篇的文章,在我们平时编程过程中有没有遇到过这样的一个情景,你定义的类只是用来封装一些相关的数据,但并不需要相关联的方法.事件和其他自定义的功能.同时,这个类仅仅在当前的应用程序中使用,而不需要在项目间重用.你所需要的只是一个“临时的”类型,现在我们来看看这个传统类的定义: 1 internal class oneClass 2  3 { 4  5      //定义若干私有数据成员 6  7      //通过属性来封装每个数据成员 8  9   

C#4.0语法糖之第三篇: 参数默认值和命名参数 对象初始化器与集合初始化器

今天继续写上一篇文章C#4.0语法糖之第二篇,在开始今天的文章之前感谢各位园友的支持,通过昨天写的文章,今天有很多园友们也提出了文章中的一些不足,再次感谢这些关心我的园友,在以后些文章的过程中不断的完善以及自我提高,给各位园友们带来更好,更高效的文章. 废话就说到这里,下面正式进入我们的今天的C#4.0语法糖,今天给大家分享一下参数默认值.命名参数.对象初始化器和集合初始化器. 参数默认值和命名参数:方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合

探索C#之6.0语法糖剖析

阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和finally代码块内的Await nameof表达式 扩展方法 总结 自动属性默认初始化 使用方法: public string Name { get; set; } = "hello world"; 为了便于理解使用2.0语法展示,编译器生成代码如下: public class Custom

C#4.0语法糖之第一篇:自动属性&amp;隐式类型

今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象. get and set accessors." id="mt3">如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问. 我们C#4.0以前的传统方式的属性是用来封装字段的,这里我简单的对比一下这两种方

C#语法糖之第五篇: 泛型委托- Action&lt;T&gt;

因为工作的原因(其实还是个人的惰性)昨天没有给大家分享文章,然后这几天也有很多园友也提出了他们报告的意见及指导,再次感谢这些兄弟们的照顾我 和支持,这个分类的文章我当时想的是把我的学习经验和工作中用到的语法给大家分享给大家,希望能起到帮助的作用,但是本人也是个菜鸟,不是什么大神,所以 学习中也有不足的地方和没有扫到的地方,这里对上次扩展方法语法糖的问题,扩展方法确实是3.0开始就有了,或许是我以前没有用到,也没有查询欠缺,若要给大家带来不便,请大家原谅,现在把标题也修改为C#语法糖了,这里给大家

C#语法糖之第六篇: 泛型委托- Predicate&lt;T&gt;、Func&lt;T&gt;

今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看一下它的定义吧: 1 public delegate bool Predicate<T>(T obj); 从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用

C#6.0语法糖剖析

1.自动属性默认初始化 使用代码 public string Id { get; set; } = "001"; 编译器生成的代码: public class Customer { [CompilerGenerated] private string kBackingField = "hello world"; public Customer() { this.kBackingField = "hello world"; } public str

C#高级功能(四)扩展方法和索引

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.  它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.  仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Col

dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法

什么是中间件 中间件是在管道中处理Request请求与Responses响应的一种组件,每种组件可以选择是否让Request进入到下一个组件去处理. 译得不好,大家可以自己看原文Middleware 更详细的还可以参照园中大神的作品: 有汤姆大叔的解读ASP.NET 5 & MVC6系列(6):Middleware详解 artech大神的 ASP.NET Core真实管道详解[1]:中间件是个什么东西? 怎么创建一个Middleware请参考英文文档Middleware 或者 LineZero的