【写给Cpp选手的C#教程】扩展方法篇
扩展方法的简单使用
扩展方法允许在现有类型上扩展新的方法而无需修改原始类型的定义。
个人认为这是“对扩展开放,对修改关闭”的体现。
具体为什么要遵守开闭原则,多做几个大项目你就知道了。
有时候重构代码都比修改代码速度来的快一些
//扩展方法必须是静态类的静态方法
public static class IntHelper
{ //扩展方法的第一个参数必须是需要扩展的类型,并且要用this进行修饰
public static bool BiggerThanFive(this int num) => num > 5; //这个函数判断int对象是否大于5
}
class Program
{
public static void Main()
{
10.BiggerThanFive(); //返回True
IntHelper.BiggerThanFive(10); //当作普通的静态方法调用,效果同上
}
}
一些规则
①需要导入扩展方法所在的命名空间才能够使用扩展方法。
②任何兼容的实例方法的优先级总是高于扩展方法。
比如说所有的类都有GetType()方法,所以我们如果将扩展方法命名为GetType(),那么就会被系统自带的覆盖掉,并不会生效。
③如果两个扩展方法完全一致,那么必须作为普通的静态函数来调用。
④如果函数名一致但参数类型不同,那么会选择参数最合适的函数来调用。
对于第四点,举个例子进行说明
interface IinterA { }
class classB : IinterA { } //继承接口IinterA
class classC : classB { } //继承类classB
static class IinterAHelper
{ //接口IinterA的扩展方法,打印IinterA
public static void GetMyType(this IinterA a){Console.WriteLine("IinterA");}
}
static class classBHelper
{ //类ClassB的扩展方法,打印classB
public static void GetMyType(this classB a) { Console.WriteLine("classB"); }
}
static class classCHelper
{ //类classC的扩展方法,打印classC
public static void GetMyType(this classC a) { Console.WriteLine("classC"); }
}
然后用一些接口啊,父类啊继承子类,大家可以猜测一下结果
class Program
{
public static void Main()
{
IinterA iB = new classB();
IinterA iC = new classC();
iB.GetMyType(); //打印IinterA,尽管里面存放的对象是classB类型
iC.GetMyType(); //打印IinterA,尽管里面存放的对象是classC类型
classB b = new classB();
classB bc = new classC();
b.GetMyType(); //打印classB
bc.GetMyType(); //打印classB,尽管里面存放的对象是classC类型
classC c = new classC();
c.GetMyType(); //打印classC
}
}
浙公网安备 33010602011771号