확장명 메서드Extension Methods

확장 메서드는 인스턴스 메서드 호출 구문을 사용 하 여 정적 메서드를 호출할 수 있도록 하는 언어 기능입니다.Extension methods are a language feature that allows static methods to be called using instance method call syntax. 이러한 메서드는 메서드가 작동 하는 인스턴스를 나타내는 매개 변수를 하나 이상 사용 해야 합니다.These methods must take at least one parameter, which represents the instance the method is to operate on.

이러한 확장 메서드를 정의 하는 클래스를 "스폰서" 클래스 라고 하며 정적으로 선언 해야 합니다.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. 확장 메서드를 사용 하려면 스폰서 클래스를 정의 하는 네임 스페이스를 가져와야 합니다.To use extension methods, one must import the namespace defining the sponsor class.

특히 소유 하지 않는 frivolously 확장 메서드를 정의 하는 것을 방지 ❌ 합니다.❌ AVOID frivolously defining extension methods, especially on types you don’t own.

형식의 소스 코드를 소유 하는 경우 대신 일반 인스턴스 메서드를 사용 하는 것이 좋습니다.If you do own source code of a type, consider using regular instance methods instead. 소유 하 고 있지 않은 경우에는 메서드를 추가 하는 것이 좋습니다.If you don’t own, and you want to add a method, be very careful. 확장 메서드를 자유롭게 사용 하면 이러한 메서드를 사용 하도록 설계 되지 않은 복잡 한 형식의 Api가 발생할 수 있습니다.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

다음 시나리오에서는 확장 메서드를 사용 하는 것이 좋습니다 ✔️.✔️ CONSIDER using extension methods in any of the following scenarios:

  • 인터페이스의 모든 구현과 관련 된 도우미 기능을 제공 하려는 경우 핵심 인터페이스를 기준으로 기능을 작성할 수 있습니다.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. 구체적 구현은 인터페이스에 할당할 수 없기 때문입니다.This is because concrete implementations cannot otherwise be assigned to interfaces. 예를 들어 LINQ to Objects 연산자는 모든 IEnumerable<T> 형식에 대 한 확장 메서드로 구현 됩니다.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. 따라서 IEnumerable<> 구현은 자동으로 LINQ를 사용 하도록 설정 됩니다.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • 인스턴스 메서드가 일부 형식에 대 한 종속성을 도입할 때 이러한 종속성은 종속성 관리 규칙을 중단 합니다.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. 예를 들어 String에서 System.Uri로의 종속성이 바람직하지 않을 수 String.ToUri() 있으므로 System.Uri를 반환 하는 인스턴스 메서드는 종속성 관리 관점에서 잘못 된 디자인입니다.For example, a dependency from String to System.Uri is probably not desirable, and so String.ToUri() instance method returning System.Uri would be the wrong design from a dependency management perspective. System.Uri 반환 하 Uri.ToUri(this string str) 정적 확장 메서드는 훨씬 더 나은 디자인입니다.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

System.Object에 확장 메서드를 정의 하지 않습니다.❌ AVOID defining extension methods on System.Object.

Visual Basic 사용자는 확장 메서드 구문을 사용 하 여 개체 참조에서 이러한 메서드를 호출할 수 없습니다.Visual Basic users will not be able to call such methods on object references using the extension method syntax. Visual Basic에서 참조를 개체로 선언 하면 그에 대 한 모든 메서드 호출이 런타임에 바인딩되고 (라는 실제 멤버가 런타임에 결정 됨)에는 확장 메서드에 대 한 바인딩이 런타임에 결정 되기 때문에 Visual Basic는 이러한 메서드 호출을 지원 하지 않습니다. 컴파일 시간 (초기 바인딩)입니다.Visual Basic does not support calling such methods because, in Visual Basic, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound).

이 지침은 동일한 바인딩 동작이 있는 다른 언어나 확장 메서드가 지원 되지 않는 경우에 적용 됩니다.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

인터페이스에 메서드를 추가 하거나 종속성을 관리 하는 경우를 제외 하 고 확장 형식과 동일한 네임 스페이스에 확장 메서드를 넣지 ❌.❌ DO NOT put extension methods in the same namespace as the extended type unless it is for adding methods to interfaces or for dependency management.

다른 네임 스페이스에 있는 경우에도 동일한 서명을 사용 하 여 두 개 이상의 확장 메서드를 정의 하지 ❌ 합니다.❌ AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

형식이 인터페이스인 경우 확장 형식과 동일한 네임 스페이스에 확장 메서드를 정의 하는 것이 좋습니다. 대부분의 경우 또는 모든 경우에 확장 메서드를 사용 하려는 경우에 ✔️ 합니다.✔️ CONSIDER defining extension methods in the same namespace as the extended type if the type is an interface and if the extension methods are meant to be used in most or all cases.

❌은 일반적으로 다른 기능과 연결 된 네임 스페이스의 기능을 구현 하는 확장 메서드를 정의 하지 않습니다.❌ DO NOT define extension methods implementing a feature in namespaces normally associated with other features. 대신 자신이 속한 기능과 연결 된 네임 스페이스에서 정의 합니다.Instead, define them in the namespace associated with the feature they belong to.

확장 메서드 (예: "확장")에 전용으로 사용 되는 네임 스페이스의 일반적인 이름을 지정 하지 ❌.❌ AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). 대신 설명이 포함 된 이름 (예: "라우팅")을 사용 합니다.Use a descriptive name (e.g., "Routing") instead.

2005, 2009 Microsoft Corporation © 부분입니다. All rights reserved.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Pearson Education, Inc의 동의로 재인쇄. 출처: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 작성자: Krzysztof Cwalina 및 Brad Abrams, 출판 정보: Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

참고 항목See also