网站首页 文章专栏 C#基础知识回顾-扩展方法
C#基础知识回顾-扩展方法
编辑时间:2017-03-04 18:49 作者:Absolutely 浏览:762 评论:2

目录


扩展方法概念

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

扩展方法例子

    理解C#扩展方法最好的的办法就是从例子中学习。

    String类已经为我们提供了很多操作字符串的方法,但是有些常用的依然无法满足,比如获取指定字符串在另一个字符串中出现的次数。

    方法定义:

    public static class MyExtensions
    {
        /// <summary>
        /// 获取指定字符串在当前字符串中出现的次数
        /// </summary>
        /// <param name="str">当前字符串</param>
        /// <param name="search">指定字符串</param>
        /// <returns>出现的次数</returns>
        public static int SearchCount(string str, string search)
        {
            if (!string.IsNullOrEmpty(str) || !string.IsNullOrEmpty(search))
            {
                string[] resultString = Regex.Split(str, search, RegexOptions.None);

                return resultString.Length - 1;
            }
            return 0;
        }
    }   
     方法调用:    
    int count = MyExtensions.SearchCount("Hello World", "l");

    上述代码运行起来没问题,效果也能达到,但不够理想。

    第一个问题是要使用这个方法,你首先要知道MyExtensions类的存在,第二个是对代码整体阅读理解起来也没有扩展方法容易。

    针对上面两个问题,如果代码写成这样:

    int count = "Hello World".SearchCount("l");

    一眼就能看出是从"Hello World"查找"l"的数量,而且不需要MyExtensions

    扩展方法正好能够帮我们实现。要想将SearchCount转变成扩展方法,只需在第一个参数前添加this关键字:

    public static class MyExtensions
    {
        /// <summary>
        /// 获取指定字符串在当前字符串中出现的次数
        /// </summary>
        /// <param name="str">当前字符串</param>
        /// <param name="search">指定字符串</param>
        /// <returns>出现的次数</returns>
        public static int SearchCount(this string str, string search)
        {
            if (!string.IsNullOrEmpty(str) || !string.IsNullOrEmpty(search))
            {
                string[] resultString = Regex.Split(str, search, RegexOptions.None);

                return resultString.Length - 1;
            }
            return 0;
        }
    } 

    这个时候,相当于对所有String类对象提供了一个SearchCount方法,并且可以通过VS的“智能感知”功能通过"."找到该方法。


    现在执行下面这行代码的时候:

    int count = "Hello World".SearchCount("l");
     编译器首先检查String类或者他的基类时候提供了SearchCount(string search)方法,如果没有就继续检查是否有任何静态类定义了SearchCount(this string str,string search)方法。本例中,"Hello World"类型是String,而String类没有提供SearchCount(string search)方法,但是编译器找到MyExtensions静态类中SearchCount(this string str,string search)方法,所以生成相应的IL代码来调用这个静态方法。


规则和原则 

    关于扩展方法,有一些规则和原则需要注意。


  1. C#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等。
  2. 扩展方法必须在非泛型的静态类中声明。
  3. 扩展方法至少要有一个参数,且只有第一个参数能用this关键字标记。
  4. 扩展方法必须在顶级静态类中定义,不能再嵌套类中。
  5. 用一个扩展方法扩展一个类型时,同时也扩展了派生类型。



    出自: 不落阁

    地址:www.lyblogs.cn

    转载请注明出处


来说两句吧
最新评论
  • TonyLaw
    TonyLaw 2017-03-27 11:10:59

     [微笑] 我微信 mcessol  

  • 张董丶
    张董丶 2017-03-29 14:43:54
    [微笑] 来支持一下~~