目录
1.基本概念
为现有非静态变量类型添加新方法。
作用:提升程序拓展性,不需要在对象中重新写方法,不需要通过继承来添加方法,为别人封装的类型写额外的方法。
特点:一定是写在静态类中,一定是一个静态函数,第一个参数为拓展目标,第一个参数用this修饰。
2.基本语法
访问修饰符 static 返回值 函数名(this 拓展类名 参数名,参数类型 参数名, 参数类型 参数名...)
3.实例
static class Tools
{
//为int拓展了一个成员方法
//成员方法是需要实例化对象后才能使用的
//value代表使用该方法的实例化对象
public static void SpeakValue(this int value)
{
//拓展方法的逻辑
Console.WriteLine("为int拓展的方法"+value);
}
public static void SpeakStringInfo(this string str,string str2,string str3)
{
Console.WriteLine("为string拓展的方法");
}
}
4.使用
static void Main(string[] args)
{
int i=10;
i.SpeakValue();
string str="000";
str.SpeakString("Nicole Potter","111");
}
5.为自定义的类型拓展方法
class Test
{
public int i=10;
public void Fun()
{
Console.WriteLine("123");
}
}
public static void Fun3(this Test t)
{
//为Test拓展的方法
}
静态类不能为静态类拓展方法,若是拓展方法与原方法同名,则调用原方法。
注意:可以有返回值和n个参数。
①扩展方法的基本原则:
(1).C#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等。
(2).扩展方法(第一个参数前面是this的方法)必须在非泛型的静态类中声明,扩展方法必须有一个参数,而且只有第一个参数使用this标记。
(3).C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。
(4).C#编译要求“导入”扩展方法。(静态方法可以任意命名,C#编译器在寻找方法时,需要花费时间进行查找,需要检查文件作用域中的所有的静态类,并扫描它们的所有静态方法来查找一个匹配)
(5).多个静态类可以定义相同的扩展方法。
(6).用一个扩展方法扩展一个类型时,同时也扩展了派生类型。
②扩展方法声明:
(1).必须在一个非嵌套的、非泛型的静态类中(所以必须是一个静态方法)
(2).至少有一个参数。
(3).第一个参数必须附加this关键字做前缀。
(4).第一个参数不能有其他任何修饰符(如ref或out)。
(5).第一个参数的类型不能是指针类型。
扩展方法不能和调用的方法放到同一个类中。
最好保证扩展方法和调用方法在同一个命名空间下。