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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
48.5: 확장 메소드의 접근 가능 범위: public (혹은 internal) 멤버들 (0) | 2022.09.21 |
---|---|
48.4: Generic 확장 메소드 (1) | 2022.09.21 |
48.2: Null 인지 확인하기 (0) | 2022.09.21 |
48.1: 확장 (Extension) 메소드의 개요 (0) | 2022.09.21 |
48: 확장 (Extension) 메소드 (0) | 2022.09.21 |