乐趣区

关于c#:如何使用-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

退出移动版