扩展方法(C# 编程指南)

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

最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.CollectionsIEnumerableSystem.Collections.GenericIEnumerableT 类型。 若要使用标准查询运算符,请先使用

using System.Linq;

指令将它们置于范围中。然后,任何实现了 IEnumerableT 的类型看起来都具有 GroupBy、 OrderBy、 Average 等实例方法。 在 IEnumerableT 类型的实例(如 ListT 或 Array)后键入“dot”时(就是符号点"."),可以在 IntelliSense 语句(IntelliSense翻译为“智能感知/智能感应功能”。)完成中看到这些附加方法。-------------一种 Microsoft 技术,这种技术通过在光标悬停在函数上时显示类定义和注释,从而让您可以分析源代码。当您在 IDE 中键入函数名时,IntelliSense 还可以完成这些名称。

IntelliSense 会在您编辑时自动插入代码,包括结束标记、右大括号以及值两边的引号。例如,如果您键入一个开始标记(如 <p>),它将自动插入结束标记(在本例中为 </p>)。--------

下面的示例演示如何对一个整数数组调用标准查询运算符 OrderBy 方法。 括号里面的表达式是一个 lambda 表达式。 很多标准查询运算符采用 lambda 表达式作为参数,但这不是扩展方法的必要条件。

 1 class ExtensionMethods2
 2 {
 3
 4     static void Main()
 5     {
 6         int[] ints = { 10, 45, 15, 39, 21, 26 };
 7         var result = ints.OrderBy(g => g);
 8         foreach (var i in result)
 9         {
10             System.Console.Write(i + " ");
11         }
12     }
13 }
14 //Output: 10 15 21 26 39 45 

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

下面的示例演示为 SystemString 类定义的一个扩展方法。 请注意,它是在非嵌套的、非泛型静态类内部定义的:

 1 namespace ExtensionMethods
 2 {
 3     public static class MyExtensions
 4     {
 5         public static int WordCount(this String str)
 6         {
 7             return str.Split(new char[] { ‘ ‘, ‘.‘, ‘?‘ },
 8                              StringSplitOptions.RemoveEmptyEntries).Length; //string类Split()方法的重载
 9         }
10     }
11 } 

可使用此 using 指令将

WordCount

扩展方法置于范围中:

using ExtensionMethods;

而且,可以使用以下语法从应用程序中调用该扩展方法:

string s = "Hello Extension Methods";
int i = s.WordCount();

在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。-----------------静态类种方法都设置为public static类型。

通用准则:

通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现。 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。

在使用扩展方法来扩展你无法更改其源代码的类型时,你需要承受该类型实现中的更改会导致扩展方法失效的风险。

如果你确实为给定类型实现了扩展方法,请记住以下几点:

  1. 如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。
  2. 在命名空间级别将扩展方法置于范围中。 例如,如果你在一个名为 Extensions的命名空间中具有多个包含扩展方法的静态类,则这些扩展方法将全部由 using Extensions;指令置于范围中。

针对已实现的类库,不应为了避免程序集的版本号递增而使用扩展方法。 如果要向你拥有源代码的库中添加重要功能,应遵循适用于程序集版本控制的标准 .NET Framework 准则。

扩展方法(C# 编程指南)

时间: 2024-10-11 02:29:58

扩展方法(C# 编程指南)的相关文章

iOS ---Extension编程指南

当iOS 8.0和OS X v10.10发布后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他app时使用该项功能.你可以开发一个应用扩展来执行某些特定的任务,用户使用该扩展后就可以在多个上下文环境中执行该任务.比如说,你提供了一个能让用户把内容分享到社交网站的扩展,用户可以在阅读邮件信息或者上网时通过app扩展来发表评论.或者说,如果你提供了一个能展示当前比赛分数的扩展,那么用户可以把它放在通知中心,这样在他们打开To

ASP.NET MVC学前篇之扩展方法、链式编程

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,

在Win7(64位)使用VS2015运行《OpenGL编程指南》第八版第一章程序的方法

前言:笔者第一次用vs2015来实现<OpenGL编程指南>第八版第一个程序时确实花费了不少时间,按照网上教程,尝试了各种方法,最终花费了两个上午加一个下午的时间, 成功运行了程序,花了这么多时间,确实让人懊恼,现在把运行程序的步骤记录下来,以便查阅. 1.第一步,下载oglpg-8th-edith. 如果去书本上的官网下载,下载的是第九版的,而不是第八版的源码. 去其他网站下载,下载的这个包里面没有第一章的源码,可以网上黏贴其他人的代码,建议下第八版源码,下载网址:链接:http://pan

链式编程:泛型实现的扩展方法类

序言 本文分享一个用链式编程思想和泛型实现的扩展方法类,用于减少代码量,并提供更为清晰的业务逻辑代码表达. 概念 链式编程:将多个业务逻辑(方法)通过“.”(点号)串联起来的一种代码风格,形似链条,故称链式编程.核心思想在于每个方法均返回自身实例. 泛型:可以理解为是一个类的“篮子“”,只要符合约束的类均可以放置在该“篮子”里面. 扩展方法:向现有类添加方法. 根据泛型和扩展方法的特点,泛型+扩展方法实现了向所有符合约束的“类”添加方法,可减少重复代码量. (.Net语言提供了这么优雅的特性,刚

C#编程(二十一)----------扩展方法

C#中的扩展方法 有许多扩展类的方式.如果有类的源代码,继承就是给类添加功能的好方法.但是如果没有源代码,怎么办?吃屎可以使用扩展方法,它允许改变一个类,但不需要该类的源代码.扩展方法是静态方法,它是类的一部分,但实际上没有放在类的源代码中.例如我有一个Money类,不知道源代码,需要一个AddToAmount(decimal amountToAdd). 我们可以这么做: namespace Wrox { public static class MoneyExtension { public s

C#原始类型扩展方法—this参数修饰符

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.仅当您使用 using 指令将命名空间显式导入到源代码中之后,扩

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

OC运行时编程指南

一.介绍 OC这个语言尽可能的将一些决定从编译和链接时推迟到运行时.它会尽可能的动态的处理事情.这意味这个语言不仅需要一个编译器,还需要一个运行时系统去执行编译过的代码.这个运行时系统扮演着对于OC这个语言操作系统的的角色,使得这个语言得以运行. 这个教程将探究NSObject这个类以及OC这个语言和运行时系统是如何进行交互的.特别是如何在运行时动态的根据类的范式加载类,并且传递给其他对象.同时这个教程还将告诉你如何在你的程序运行过程中找到你的对象的运行信息. OC运行时编程指南描述了OC运行时

ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: 1 <input name="UserName&q