C# 扩展方法的使用

译文链接:https://www.infoworld.com/art...

C# 在 3.0 版本中提供了对 扩展方法 的支持,扩展方法常用于给一个已存在的类添加新的方法从而扩展该类的功能,最关键的是:你不需要在现存类中派生一个子类,你也不需要破坏性的修改类的现有代码骨架,更谈不上重新编译了,扩展方法能够提供代码的可读性同时又可以扩展类的功能。

.NET 框架中最常见的扩展方法包括 Linq 标准的查询操作,这类扩展方法极大的扩展了System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T> 的查询能力,如下图:

现在你明白了扩展方法,你可以用这项技术去给已存在的 class 或者 interface 添加更多实用方法而不应该从子类中新增额外的方法,MSDN上说:扩展方法允许你给现有的类 添加 方法,而不需要你生成子类,重新编译,或者任何其他形式的修改原有类,扩展方法是一种特殊的静态方法,当你调用它的时候就好像它就是你扩展类的原生方法。

本质上来说,扩展方法也算是一种特殊的静态方法,它允许你给已存在的类添加新的方法即使你没有权限访问这个扩展类的源代码,扩展方法除了签名中的第一个参数是 this 之外就和静态方法是一模一样,你可以给任何一个类添加任意多的扩展方法,更🐂👃的是:这个扩展方法特性还可以作用到值类型之上。

当你使用扩展方法的时候,请记住下面的几个点:

  • 扩展方法必须是一个静态方法
  • 扩展方法必须在 static class 内,类的名字无所谓
  • 扩展方法的第一个参数一定是 this,后面跟上你需要扩展的类型

有一点要特别注意,如果扩展方法的名字和你要扩展类中的某一个方法重名了,那么你的扩展方法将会失效,永远也不会被调用。

使用 C# 扩展方法

这一节中我们一起探讨下如何使用 C# 来实现一个扩展方法,下面的代码清单展示了 C# 中的扩展方法到底长成什么样?

  public static class StringExtensions
  {
    public static bool IsNumeric(this string str)
    {
      double output;
      return double.TryParse(str, out output);
    }
  }

请注意扩展方法中的第一个参数,正如之前讨论过的,任何扩展方法都必须是静态的,而且在参数之前还要申明一下 this 关键词,比如像上面这个例子一样,相当于告诉了编译器你已经在 string 类上扩展了一个 IsNumeric 方法。

接下来一起看一下如何在 string 类中使用 IsNumeric 方法。

    static void Main(string[] args)
    {
      string str = "100";

      if (str.IsNumeric()) Console.WriteLine("The string object named str contains numeric value.");

      Console.Read();
    }

当你执行完上面这段程序,会在控制台输出:The string object named str contains numeric value。

你可以使用扩展方法这门技术通过向类添加方法的形式增强类的功能,而不需要修改,派生或者重新编译原来的类型,正如之前我提到的,扩展方法也可以应用于值类型之上,接下来我通过一个例子来验证下这是如何实现的。

下面我定义了一个 IntegerExtensions 类,里面有一个 IsEven 扩展方法,当输入的参数是偶数的话,这个方法会返回 true,否则返回 false。

  public static class IntegerExtensions
  {
    public static bool IsEven(this int i)
    {
      return ((i % 2) == 0);
    }
  }

接下来的代码将会展示如何在 integer 类型上调用这个扩展方法。

    static void Main(string[] args)
    {
      int n = 2;

      if (n.IsEven()) Console.WriteLine("The value of the integer is even.");
    }

更多高质量干货:参见我的 GitHub: dotnetfly

以上就是C# 扩展方法的使用的详细内容,更多关于c# 扩展方法的资料请关注我们其它相关文章!

(0)

相关推荐

  • asp.net(c#)网页跳转七种方法小结

    ①response.redirect 这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳 转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录保护.但速度慢是其最大缺陷!redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端.需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session. 实例 Example that uses Redirect [C#;

  • 关于C#泛型列表List<T>的基本用法总结

    示例代码如下:namespace SampleListT{  class Program  {      static void Main(string[] args)      {//using System.Collections.Generic; 命名空间中的List<T>//using System.Collections; 命名空间中的ArrayList  //都实现了列表集合,一个是泛形集合,一个是非泛型的//下面我们将Person对象加到集合中 Person p1 = new P

  • c#的dllimport使用方法详解

    DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称.DllImport的定义如下: 复制代码 代码如下: [AttributeUsage(AttributeTargets.Method)]public class DllImportAttribute: System.Attribute{public DllImportA

  • 详解c# AutoMapper 使用方式

    安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已. 为什么要用DTO? 1.DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层 2.DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的.因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域Mod

  • c#处理3种json数据的实例

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋友. 一.C#处理简单json数据 json数据: 复制代码 代码如下: {"result":"0","res_info":"ok","queryorder_info":"info"} 我这

  • C#几种截取字符串的方法小结

    1.根据单个分隔字符用split截取 例如 复制代码 代码如下: string st="GT123_1"; string[] sArray=st.split("_"); 即可得到sArray[0]="GT123",sArray[1]="1"; 2.利用多个字符来分隔字符串 例如 复制代码 代码如下: string str = "GTAZB_JiangjBen_123";string[] sArray = s

  • C# AutoMapper 使用方法总结

    本文基于 AutoMapper 9.0.0 AutoMapper 是一个对象-对象映射器,可以将一个对象映射到另一个对象. 官网地址:http://automapper.org/ 官方文档:https://docs.automapper.org/en/latest/ 1 入门例子 public class Foo { public int ID { get; set; } public string Name { get; set; } } public class FooDto { publi

  • C#中string.format用法详解

    本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. String.Format (String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项. String.Format (IFormatProvide

  • C# 中AutoMapper的使用方法

    译文链接: https://www.infoworld.com/art... AutoMapper 是一个非常流行的 object-to-object 映射库,它的目的就是帮助你实现不同类型对象之间的映射,举一个例子,在 DDD 开发模式中,你可能需要实现将 DTO object 映射为 Model object,在过去,你需要人肉的将这两个类型下的属性字段进行一一映射,现在 AutoMapper 就可以帮你节省 这种冗余的模板式代码 匹配所耗费的时间. 开始玩 AutoMapper 之前,你需

  • .NET实用扩展方法详解

    持续更新的.NET实用扩展方法,具体内容如下 1. 字符串转换为可空数值类型(int, long, float...类似) /// <summary> /// 将字符串转换成32位整数,转换失败返回null /// </summary> /// <param name="str">转换的字符串</param> /// <returns>转换之后的整数,或null</returns> public static in

  • ES6中的数组扩展方法

    form 转化为真正的数组 先说一下使用场景,在Js中,我们要经常操作DOM,比如获取全部页面的input标签,并且找到类型为button的元素,然后给这个按钮注册一个点击事件,我们可能会这样操作: var inputObjs=document.getElementsByTagName('input'); for(var i=0;i<inputObjs.length;i++){ if(inputObjs[i].type==='button'){ inputObjs[i].onclick=func

  • Jquery中扩展方法extend使用技巧

    在使用Jquery开发的过程中,extend是常用的参数处理函数,特别是对默认值的使用. Jquery的扩展方法原型是: var v=$.extend(dest,src1,src2,[,src3...]); 作用是把src1,src2,src3合并到到dest中并返回合并后的dest. 但是在使用过程中,默认值往往是不能被改变的, 如下: var defaut={'selector':'select','default':'默认值','backcolor':'#85e137','forecolo

  • asp.net中CSharpThinking扩展方法分析

    本文实例讲述了asp.net中CSharpThinking扩展方法.分享给大家供大家参考.具体分析如下: 一.演变 ① 扩展方法特征 1)必须在一个静态方法中. 2)至少有一个参数. 3)第一个参数必须附加this关键字作为前缀. 4)第一个参数不能有其他任何修饰符(如 out,ref). 5)第一个参数的类型不能是指针. 6) 如果扩展方法名称与类型的方法一样(如都命名为ToString),则只有类型的方法会被调用,而扩展方法的不会,这是一个优先级问题. ② 扩展方法与普通静态方法的比较 C#

  • 如何利用扩展方法来链式的对MVC 3中的页面进行验证

    .Net 3.0 添加了一个语法糖就是扩展方法,其实扩展方法的本质就是对类的静态方法的调用,虽然扩展方法只是改变了我们写代码的方式,但是如果我们使用得当,可以给我们带来巨大的编码效率的提升.对于C#扩展方法的使用,我就不细说了,贴段代码说明扩展方法的使用,大家就会回忆起来. 复制代码 代码如下: public static class Extensions { public static string EndWith(this string str) { return str + "@"

  • 用扩展方法优化多条件查询(不定条件查询)

    在我们开发过程中,特别是管理系统的开发,经常会遇到多条件查询(或者叫不定条件查询)的案例,就是提供给User输入的查询条件有多个不同的查询栏位,而且,在实际使用中并不能确定User会使用哪些条件来当做搜索条件. 下图就是我们实际项目中一个查询页面的截图,  User在实际操作中,有可能会只根据[扣帐编号]查询,那么,只要在[扣帐编号]栏位输入号码,其他栏位留空即可,那么查询语句就只卡[扣帐编号]这条条件也有可能直接根据日前范围查询,只要输入起始日期即可.当然,在实际开发的时候我们是不能预判Use

  • Js-$.extend扩展方法使方法参数更灵活

    在做JS开发时,我们将第三方复杂的插件进行封装,然后对外公开一个很简单的方法接口,这是开发时常用的方法,在JS里,我们的方法参数通常使用JQ的$.extend 扩展方法来实现 复制代码 代码如下: function extend(arr) { arr = $.extend({ name: 'zzl', sex: 'male', age: 31 }, arr || {}); alert("[Name:]" + arr.name + "[Sex:]" + arr.sex

  • JS扩展方法实例分析

    本文实例讲述了JS扩展方法实现技巧.分享给大家供大家参考.具体分析如下: JS扩展方法与C#的扩展方法非常相似,也是可以链式调用的,也是通过对某个类的扩展写法来实现.这个东西非常好用,如果将预先写好的方法放到一个js里面引用的话,那么后面写js将非常有趣. 下面给出一个例子: <head> <title>测试JS扩展方法</title> <script type="text/javascript"> // 合并多个空白为一个空白 Stri

  • C#基于Extension Method(扩展方法)获得文件大小的方法

    本文实例讲述了C#基于Extension Method(扩展方法)获得文件大小的方法.分享给大家供大家参考.具体分析如下: 文件信息类的一个Extension Method,返回文件大小的格式化的版本. 比如:1 GB or 100 B and it at max it will have two decimals. 添加下面代码到同样的命名空间的公共静态类,创建新的FileInfo,调用GetFileSize. /// <summary> /// Gets a files formatted

  • C#中的扩展方法详解

    扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释.假设一个控制台程序class Program{}里面的主函数如下: static void Main(string[] args) { DateTime now = DateTime.Now; string time = now.ToStri

随机推荐