English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
명칭 그대로, 확장 메서드는 추가 메서드입니다. 확장 메서드는 원본 클래스, 구조체, 인터페이스를 수정, 상속, 재구성하지 않고 다른 메서드를 주입할 수 있게 합니다. 확장 메서드는 자신의 사용자 정의 클래스, .NET Framework 클래스, 第三方 클래스 또는 인터페이스에 추가할 수 있습니다.
확장 메서드는 C#입니다 3.0에서 추가된 특성은, 원본 클래스 코드를 수정하지 않고 ADD File 모드를 통해 원본 코드 기능을 확장할 수 있습니다.
확장 메서드는 다음과 같은 요구사항을 가집니다:
확장 메서드는 static 키워드로修饰된 클래스에 포함되어야 합니다.
확장 구현은 정적 형식이어야 합니다.
확장 메서드 첫 번째 매개변수는 this 접두사로 시작하여 확장할 클래스 객체를 나타내며, 두 번째 매개변수부터는 확장 메서드 매개변수 목록입니다.
다음 예제에서 IsGreaterThan()는 int 타입의 확장 메서드로, int 변수의 값이 제공된 정수 매개변수보다 크면 true를 반환합니다.
int i = 10; bool result = i.IsGreaterThan(100); //FALSE를 반환
IsGreaterThan() 메서드는 int 데이터 타입의 메서드가 아닙니다 (Int32 struct). 이는 프로그래머가 int 데이터 타입에 대해 작성한 확장 메서드입니다. IsGreaterThan() 확장을 포함하는 네임스페이스를 포함하면, IsGreaterThan() 확장 메서드는 전체 애플리케이션에서 사용할 수 있습니다.
확장 메서드는 Visual Studio의 IntelliSense에서 특별한 기호를 가지고 있어서, 클래스 메서드와 확장 메서드를 쉽게 구분할 수 있습니다.
이제 확장 메서드를 작성하는 방법을 보겠습니다.
확장 메서드는 실제로는 정적 클래스에서 정의된 특별한 정적 메서드입니다. 확장 메서드를 정의하려면, 먼저 정적 클래스를 정의합니다.
예를 들어, 다음 예제에서는 ExtensionMethods 네임스페이스 아래에 IntExtensions 클래스를 생성했습니다. IntExtensions 클래스는 int 데이터 타입에 적용할 수 있는 모든 확장 메서드를 포함합니다. (네임스페이스와 클래스 이름은 어떤 이름을 사용하든 됩니다.)
namespace ExtensionMethods { public static class IntExtensions { } }
现在,将静态方法定义为扩展方法,其中扩展方法的第一个参数指定了适用扩展方法的类型。我们将在int类型上使用此扩展方法。因此,必须在第一个参数 int 之前加上this 修饰符。
例如,IsGreaterThan()方法对int进行操作,因此第一个参数为this int i。
namespace ExtensionMethods { public static class IntExtensions { public static bool IsGreaterThan(this int i, int value) { return i > value; } } }
现在,您可以将 ExtensionMethods 命名空间包含在任何希望使用此扩展方法的地方。
using ExtensionMethods; class Program { static void Main(string[] args) { int i = 10; bool result = i.IsGreaterThan(100); Console.WriteLine(result); } }
false
常规静态方法和扩展方法之间的唯一区别是,扩展方法的第一个参数指定其将要对运算符进行操作的类型,其后跟 this 키워드.
C#只支持扩展方法,不支持扩展属性、扩展事件、扩展操作符等。
扩展方法(第一个参数前面是this的方法)必须在非泛型的静态类中声明,扩展方法必须有一个参数,而且只有第一个参数使用this标记。
C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。
C#编译要求“导入”扩展方法。(静态方法可以任意命名,C#编译器在寻找方法时,需要花费时间进行查找,需要检查文件作用域中的所有的静态类,并扫描它们的所有静态方法来查找一个匹配)
多个静态类可以定义相同的扩展方法。
用一个扩展方法扩展一个类型时,同时也扩展了派生类型。
必需在一个非嵌套的、非泛型的静态类中(所以必需是一个静态方法)
최소한 하나의 파라미터가 있어야 합니다.
첫 번째 파라미터는 this 키워드를 프리كس로 추가해야 합니다.
첫 번째 파라미터는 다른修饰자(예: ref 또는 out)를 가질 수 없습니다.
첫 번째 파라미터의 타입은 포인터 타입이 될 수 없습니다.
확장 메서드는 원래 클래스에 포함되지 않은 다른 사용자 정의 메서드입니다.
확장 메서드는 사용자 정의, .NET Framework 또는 제3자 클래스, 구조체 또는 인터페이스에 추가될 수 있습니다.
확장 메서드의 첫 번째 파라미터는 확장 메서드에 적합한 타입이어야 하며, 그 다음에this키워드.
확장 메서드의 이름을 포함한 네임스페이스를 통해, 애플리케이션의 어느 위치에서도 확장 메서드를 사용할 수 있습니다.