博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linq之扩展方法
阅读量:6575 次
发布时间:2019-06-24

本文共 1978 字,大约阅读时间需要 6 分钟。

目录

写在前面

上篇文章介绍了隐式类型,自动属性,初始化器,匿名类的相关概念,及通过反编译的方式查看了编译器帮我们做了那些事。本篇文章将介绍扩展方法的知识点,及如何定义,如何使用的相关内容。

系列文章

扩展方法

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

最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T> 类型。 若要使用标准查询运算符,请先使用 using System.Linq 指令将它们置于范围中。 然后,任何实现了 IEnumerable<T> 的类型看起来都具有 GroupBy、OrderBy、Average 等实例方法。 在 IEnumerable<T> 类型的实例(如 List<T> 或 Array)后键入“dot”时,可以在 IntelliSense 语句完成中看到这些附加方法。

首先看一下啊,扩展方法涨什么样子

通过上图可以发现,扩展方法所在的类必须是静态类,方法必须为静态方法,并且方法第一个参数必须以this修饰符开始。

如何自定义扩展方法?

1.定义一个静态类以包含扩展方法。 该类必须对客户端代码可见。 

2.将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。

3.该方法的第一个参数指定方法所操作的类型;该参数必须以 this 修饰符开头。

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

5.按照与调用类型上的实例方法一样的方式调用扩展方法。

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

 一个例子

为String扩展这样一个方法:返回字符串的字节数。在项目中添加一个这样的类StringExtension

1 namespace Wolfy.LinqDemo.Extensions 2 { 3     ///  4     /// string类型扩展方法 5     /// 静态类 6     ///  7     public static class StringExtension 8     { 9         /// 10         /// 获取字符串的字节数11         /// 12         /// 字符串13         /// 
字节长度
14 public static int GetBytesLength(this string source)15 {16 byte[] bytes = Encoding.Default.GetBytes(source);17 return bytes.Length;18 }19 }20 }

在使用时,首先引入你的扩展方法所在的静态类所在命名空间,比如在这个例子中,需要引入

1 //首先引入命名空间2 using Wolfy.LinqDemo.Extensions;

 然后你就可以这样来用,就好比你定义的这个方法就是string类中定义的一样。

通过代码也发现这样的问题,扩展方法,在无法修改源代码的情况下,提供了一种为该类来添加行为的方式。比如在这里咱们无法修改string类的源代码,也不可能在string类的方法中添加一个GetBytesLength的方法,但是通过扩展方法,在客户端使用的时候,就好比,这个方法就是string类的方法一样。

 在鼠标放在方法名上时,也会提示该方法是扩展方法,如图

输出结果

总结

1、扩展方法为静态方法,所在的类必须为静态类,方法第一个参数必须以this修饰符开头。

2、扩展方法在使用的时,必须能够访问到。

3、在使用时需引入扩展方法所在的命名空间。(当然你也可以直接使用要扩展的类型的命名空间,比如string类型的命名空间为System,你可以使用System作为StringExtension的命名空间,这样使用的时候不需要引入命名空间了。但一般不建议这样做!)

参考文章

MSDN:http://msdn.microsoft.com/zh-cn/library/bb383977.aspx

         http://msdn.microsoft.com/zh-cn/library/bb311042.aspx

转载地址:http://jqrjo.baihongyu.com/

你可能感兴趣的文章
chkconfig命令及的使用 与linux的七个运行级别
查看>>
中国象棋程序的设计与实现(十)--棋盘的定义和绘制
查看>>
asp.net c# 常见面试试题总结汇总(含答案)
查看>>
修改配置nginx,限制无良爬虫频率
查看>>
广义表
查看>>
centos7以上系统服务管理命令-systemctl
查看>>
javascript提醒
查看>>
nginx rewrite解决 jenkins error 404心得笔记
查看>>
Linux基础之while语句
查看>>
ubuntu10.04以及10.10安装配置tftp服务
查看>>
javascript 语言国际化
查看>>
用 Windows Live Writer [最新版本] 发布 51CTO 博客
查看>>
Quartz应用与集群原理分析
查看>>
Linux之web服务
查看>>
CentOS安装Hadoop
查看>>
Caddy – 方便够用的 HTTPS server 新手教程
查看>>
django xadmin ForeignKey display
查看>>
centos6.x文本操作
查看>>
常去的学习网站
查看>>
SVN自助更新:运维利器Puppet实例讲解
查看>>