Section 48.3: 확장 메소드를 명시적으로 (explicitly) 사용하기

확장 메소드는 일반적인 정적 (static) 클래스 메소드처럼 사용될 수도 있다. 이러한 방식의 확장 메소드 호출은 간결함이 떨어지긴 하지만, 경우에 따라 필수적일 수 있다.

static class StringExtensions { public static string Shorten(this string text, int length) { return text.Substring(0, length); } }

사용 예:

var newString = StringExtensions.Shorten("Hello World", 5);

정적 메소드 방식으로 확장 메소드를 호출해야 하는 경우들

확장 메소드를 정적 메소드와 같이 호출하여야 할 필요가 있는 경우가 여전히 존재한다:

  • 멤버 메소드와의 충돌 (conflict) 처리. 이러한 충돌은 새로운 버전의 라이브러리에 확장 메소드와 동일한 이름의 메소드가 추가된 경우 발생할 수 있다. 이러한 경우, 컴파일러에 의해 멤버 메소드가 우선적으로 호출될 것이다.
  • 동일한 서명 (signature) 을 갖는 다른 확장 메소드와의 충돌 처리. 이는 두 라이브러리가 유사한 확장 메소드를 제공하고 해당 확장 메소드가 존재하는 네임스페이스가 동일한 파일에서 사용되는 경우 발생할 수 있다.
  • delegate 파라미터에 확장 메소드를 method group 형태로 전달하는 경우.
  • Reflection 을 이용하여 사용자 스스로의 biding 을 수행하는 경우.
  • Visual Studio 의 Immediate window 에서 확장 메소드를 사용하는 경우.

Using static

using static 지시어를 통해 특정 정적 클래스의 정적 멤버들을 전역 범위 (global scope) 로 가져오는 경우, 확장 메소드들은 그 대상에서 제외된다.

예제:

using static OurNamespace.StringExtensions; // 이전 예제의 클래스를 참조한다 // OK: 확장 메소드 문법이 여전히 동작한다. "Hello World".Shorten(5); // OK: 정적 메소드 문법이 여전히 동작한다. OurNamespace.StringExtensions.Shorten("Hello World", 5); // 컴파일 시점 에러: 확장 메소드를 클래스 지정 없이 정적으로 호출할 수 없다. Shorten("Hello World", 5);

만약 Shorten 메소드의 첫번째 파라미터에서 this 한정자 (modifier) 를 제거한다면, 위 예제의 마지막 라인 역시 컴파일이 될 것이다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts