📜  C#中的扩展方法

📅  最后修改于: 2021-05-29 18:10:47             🧑  作者: Mango

在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是参数名。

  • 扩展方法始终被定义为静态方法,但是当它们与任何类或结构绑定时,它们将转换为非静态方法。
  • 当使用相同的名称和现有方法的签名定义扩展方法时,编译器将打印现有方法,而不是扩展方法。换句话说,扩展方法不支持方法覆盖。
  • 您还可以使用扩展方法概念在密封类中添加新方法。
  • 它不能应用于字段,属性或事件。
  • 它必须在顶级静态类中定义。
  • 不允许使用多个绑定参数,这意味着扩展方法仅包含一个绑定参数。但是您可以在扩展方法中定义一个或多个常规参数。

好处:

  • 扩展方法的主要优点是无需使用继承即可在现有类中添加新方法。
  • 您可以在现有类中添加新方法,而无需修改现有类的源代码。
  • 它也可以与密封类一起使用。