在C#中,扩展方法概念使您可以在现有类或结构中添加新方法,而无需修改原始类型的源代码,并且不需要原始类型的任何特殊许可,并且不需要重新编译原始类型。它是在C#3.0中引入的。
让我们借助示例来讨论这个概念。假设您有一个包含三个方法的类或结构,并且想在该类或结构中添加两个新方法,您没有该类/结构的源代码,或者没有该类/结构的权限,或者该类是密封类,但是您仍想在其中添加新方法,则可以使用概念扩展方法在现有类/结构中添加新方法。现在,您将创建一个新的静态类,其中包含要在现有类中添加的两个方法,现在将该类与现有类绑定。绑定之后,您将看到现有的类可以访问两个新添加的方法。如下面的程序所示。
示例:首先,我们在Program1.cs文件中创建一个名为Geek的类。它包含三种方法,分别是M1() , M2()和M3() 。
// C# program to illustrate the concept
// of the extension methods
using System;
namespace ExtensionMethod {
// Here Geek class contains three methods
// Now we want to add two more new methods in it
// Without re-compiling this class
class Geek {
// Method 1
public void M1()
{
Console.WriteLine("Method Name: M1");
}
// Method 2
public void M2()
{
Console.WriteLine("Method Name: M2");
}
// Method 3
public void M3()
{
Console.WriteLine("Method Name: M3");
}
}
}
现在,在Program2.cs文件中创建一个名为NewMethodClass的静态类。它包含M4()和M5()两种方法。现在我们要在Geek类中添加这些方法,因此我们使用binding参数将这些方法与Geek类绑定。之后,我们创建另一个名为GFG的目录,其中Geek类访问所有这五个方法。
// C# program to illustrate the concept
// of the extension methods
using System;
namespace ExtensionMethod {
// This class contains M4 and M5 method
// Which we want to add in Geek class.
// NewMethodClass is a static class
static class NewMethodClass {
// Method 4
public static void M4(this Geek g)
{
Console.WriteLine("Method Name: M4");
}
// Method 5
public static void M5(this Geek g, string str)
{
Console.WriteLine(str);
}
}
// Now we create a new class in which
// Geek class access all the five methods
public class GFG {
// Main Method
public static void Main(string[] args)
{
Geek g = new Geek();
g.M1();
g.M2();
g.M3();
g.M4();
g.M5("Method Name: M5");
}
}
}
输出:
Method Name: M1
Method Name: M2
Method Name: M3
Method Name: M4
Method Name: M5
重要事项:
- 在这里,绑定参数是用于将新方法与现有类或结构绑定的那些参数。调用扩展方法时,它没有任何值,因为它们仅用于绑定,而不能用于任何其他用途。在扩展方法的参数列表中,如果将绑定参数写到第二,第三或任何其他位置而不是第一位,则绑定参数始终位于第一位,那么编译器将给出错误信息。使用此关键字创建绑定参数,后跟要在其中添加新方法的类的名称以及参数名称。例如:
this Geek g
在这里,此关键字用于绑定, Geek是您要绑定的类名,而g是参数名。
- 扩展方法始终被定义为静态方法,但是当它们与任何类或结构绑定时,它们将转换为非静态方法。
- 当使用相同的名称和现有方法的签名定义扩展方法时,编译器将打印现有方法,而不是扩展方法。换句话说,扩展方法不支持方法覆盖。
- 您还可以使用扩展方法概念在密封类中添加新方法。
- 它不能应用于字段,属性或事件。
- 它必须在顶级静态类中定义。
- 不允许使用多个绑定参数,这意味着扩展方法仅包含一个绑定参数。但是您可以在扩展方法中定义一个或多个常规参数。
好处:
- 扩展方法的主要优点是无需使用继承即可在现有类中添加新方法。
- 您可以在现有类中添加新方法,而无需修改现有类的源代码。
- 它也可以与密封类一起使用。