一、扩展方法的介绍
我一般理解一个知识点喜欢拆分去理解,所以对于扩展方法的理解可以拆分为——首先它肯定是一个方法,然而方法又是对于一个类型而言的,所以扩展方法可以理解为现有的类型(现有类型可以为自定义的类型和.Net 类库中的类型)扩展(添加)应该附加到该类型中的方法。
在没有扩展方法之前,如果我们想为一个已有类型自定义自己逻辑的方法时,我们必须自定义一个新的类型来继承已有类型的方式来添加方法,使用这种继承方式来添加方法时,我们必须自定义一个新的派生类型,如果基类有抽象方法还需要重新去实现抽象方法,这样为了扩展一个方法却会导致因继承而带来的其他的开销(指的是又要去自定义一个派生类,还要覆盖基类的抽象方法等),所以使用继承来为现有类型扩展方法时就有点大才小用的感觉了,并且当我们需要为值类型和密封类(不能被继承的类)这些不能被继承的类型扩展方法时,此时继承就不能被我们所用了, 所以在C#3 中提出了用扩展方法来实现为现有类型添加方法。使用扩展方法来实现扩展可以解决使用继承中所带来的所有的弊端
扩展方法必须具备下面的规则:
它必须在一个非嵌套、非泛型的静态类中
它至少要有一个参数
第一个参数必须加上this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展)
第一个参数不能用其他任何修饰符(如不能使用ref out等修饰符)
第一个参数的类型不能是指针类型
示例:
创建一个类:
public class Methods
{
}
扩展这个类:
public static class MethodsExtension
{
public static class MethodsExtension
{
public static void StringToInt(this Methods s,string y)
{
Console.WriteLine(Convert.ToInt32(y));
}
}
}
调用扩展方法:
Methods m = new Methods();
m.StringToInt("1");
对string的扩展:
public static class stringExtension
{
public static void StringToInt(this string s)
{
Console.WriteLine(Convert.ToInt32(s));
}
}
string a = "123";
a.StringToInt();
主要用在封闭类开的类和对系统类的扩展