이것은 C #의 확장 방법과 디자인 철학에 대한 질문 이므로이 질문에 대답하는 가장 좋은 방법 은 확장 방법의 목적에 대한 MSDN 설명서 를 인용 하는 것입니다 .
확장 메서드를 사용하면 새로운 파생 형식을 만들거나 다시 컴파일하거나 원래 형식을 수정하지 않고도 기존 형식에 메서드를 "추가"할 수 있습니다. 확장 메서드는 특별한 종류의 정적 메서드이지만 확장 형식의 인스턴스 메서드 인 것처럼 호출됩니다. C #, F # 및 Visual Basic으로 작성된 클라이언트 코드의 경우 확장 메서드와 실제로 형식에 정의 된 메서드를 호출하는 것 사이에는 분명한 차이가 없습니다.
…
일반적으로 확장 방법을 필요한 경우에만 드물게 구현하는 것이 좋습니다. 가능하면 기존 유형을 확장해야하는 클라이언트 코드는 기존 유형에서 파생 된 새 유형을 작성하여 수행해야합니다. 자세한 내용은 상속을 참조하십시오.
확장 방법을 사용하여 소스 코드를 변경할 수없는 유형을 확장 할 때 유형 구현 변경으로 인해 확장 방법이 중단 될 위험이 있습니다.
주어진 유형에 대해 확장 메소드를 구현하는 경우 다음 사항을 기억하십시오.
- 확장 메서드는 형식에 정의 된 메서드와 동일한 서명이 있으면 호출되지 않습니다.
- 확장 방법은 네임 스페이스 수준에서 적용됩니다. 예를 들어이라는 단일 네임 스페이스에 확장 메서드가 포함 된 여러 정적 클래스가있는
Extensions
경우 모두 using Extensions;
지시문에 의해 범위에 포함됩니다 .
요약하면, 확장 메소드는 개발자가 직접 수행 할 수없는 경우에도 특정 유형에 인스턴스 메소드를 추가하도록 설계되었습니다. 또한 인스턴스 메서드는 확장 메서드가있는 경우 항상 확장 메서드를 재정의 하므로 (인스턴스 메서드 구문을 사용하여 호출 한 경우) 메서드를 직접 추가하거나 클래스를 확장 할 수없는 경우 에만 수행해야합니다. *
다시 말해서, 확장 메소드는 일부 클라이언트에 의해 인스턴스 메소드가 될 수 있기 때문에 인스턴스 메소드처럼 작동해야합니다. 그리고 호출되는 객체가 인 경우 인스턴스 메소드는 throw null
해야하므로 확장 메소드도 마찬가지입니다.
* 부수적으로, 이것은 LINQ의 설계자가 직면 한 상황과 정확히 일치합니다. C # 3.0이 출시되었을 때 컬렉션과 루프 모두에서 System.Collections.IEnumerable
and 를 사용 하고있는 수백만 명의 클라이언트가 이미있었습니다 . 이러한 클래스는 반환 단지 두 가지 방법이 있었다 객체 와 너무 같은 추가 요구 인스턴스 메소드 추가, , , 등, 고객의이 수백만을 깨는 것입니다. 그래서, (이 측면에서 구현 될 수 특히 이후이 기능을 제공하기 위해 와 상대적으로 쉽게), 그들은 어떤 현재 기존에 적용 할 수있는 확장 방법으로 그것을 발표System.Collections.Generic.IEnumerable<T>
foreach
IEnumerator
Current
MoveNext
Count
Any
Current
MoveNext
IEnumerable
더 효율적인 방법으로 클래스에 의해 구현 될 수도 있습니다. C #의 디자이너가 첫 날에 LINQ를 출시하기로 결정했다면이 인스턴스는의 인스턴스 메소드로 제공 IEnumerable
되었을 것이며 아마도 해당 메소드의 기본 인터페이스 구현을 제공하는 일종의 시스템을 설계했을 것입니다.