C# Language확장 메소드


통사론

  • public static ReturnType MyExtensionMethod (이 TargetType 대상)
  • public static ReturnType MyExtensionMethod (이 TargetType 타겟, TArg1 arg1, ...)

매개 변수

매개 변수 세부
확장 메소드의 첫 번째 매개 변수 앞에 항상 this 키워드가오고 뒤에 확장 할 객체의 "현재"인스턴스를 참조하는 데 사용되는 식별자가 와야합니다

비고

확장 메서드는 개체 인스턴스에서 정적 메서드가 호출되는 형식을 허용하는 구문 설탕입니다.

확장 메서드에는 명시 적 대상 객체가 필요합니다. 확장 된 키워드 자체에서 메서드에 액세스하려면 this 키워드를 사용해야합니다.

확장 메서드는 정적으로 선언되어야하며 정적 클래스에 있어야합니다.

어느 네임 스페이스인가?

확장 메서드 클래스에 대한 네임 스페이스의 선택은 가시성과 검색 가능성 간의 균형입니다.

가장 일반적으로 언급되는 옵션 은 확장 메소드에 대한 사용자 정의 네임 스페이스를 갖는 것입니다. 그러나 여기에는 의사 소통 노력이 필요하므로 코드 사용자는 확장 방법이 존재하는지, 어디에서 찾을 수 있는지 알 수 있습니다.

또 다른 방법은 개발자가 Intellisense를 통해 확장 방법을 발견 할 수 있도록 네임 스페이스를 선택하는 것입니다. 당신이 확장 할 경우에 따라서 Foo 클래스를, 그와 같은 네임 스페이스의 확장 메서드를 넣어 논리적 Foo .

아무 것도 "다른 사람의"네임 스페이스 사용을 방해 하는 것은 아무것도 없다는 것을 인식하는 것이 중요 합니다 . 따라서 IEnumerable 을 확장하려는 경우 System.Linq 네임 스페이스에 확장 메서드를 추가 할 수 있습니다.

이것은 항상 좋은 생각은 아닙니다. 예를 들어 특정 경우에 공통 유형 (예 : bool IsApproxEqualTo(this double value, double other) 을 확장 할 수 있지만 System 전체를 '오염'시키지 않을 수 있습니다. 이 경우 로컬의 특정 네임 스페이스를 선택하는 것이 좋습니다.

마지막으로 확장 메서드를 네임 스페이스에 넣지 않아도됩니다 .

좋은 참조 질문 : 확장 메서드의 네임 스페이스를 어떻게 관리합니까?

적용 분야

가능한 모든 입력에 적합하고 특정 상황과 관련이있는 것은 아님을 보장하는 확장 방법을 만들 때주의해야합니다. 예를 들어 string 과 같은 시스템 클래스를 확장하여 새 코드를 모든 문자열에서 사용할 수있게 할 수 있습니다. 코드가 도메인 특정 문자열 형식으로 도메인 특정 논리를 수행해야하는 경우 확장 메서드는 해당 존재로 인해 호출자가 시스템의 다른 문자열과 작동하는 것을 혼동하게되므로 적합하지 않습니다.

다음 목록에는 확장 메서드의 기본 기능과 속성이 나와 있습니다.

  1. 정적 메서드 여야합니다.
  2. 정적 클래스에 있어야합니다.
  3. "this"키워드를 .NET의 첫 번째 매개 변수로 사용하며이 메서드는 클라이언트 측에서 지정된 유형 인스턴스에 의해 호출됩니다.
  4. 또한 VS intellisense로 표시됩니다. 우리가 점을 누르면 . 유형 인스턴스 다음에 VS intellisense가옵니다.
  5. 확장 메서드는 사용되는 것과 동일한 네임 스페이스에 있어야하며 using 문으로 클래스의 네임 스페이스를 가져와야합니다.
  6. 확장 메서드가있는 클래스의 이름을 지정할 수는 있지만 클래스는 정적이어야합니다.
  7. 새로운 메소드를 타입에 추가하기 위해 소스 코드가 없다면, 솔루션은 그 타입의 확장 메소드를 사용하고 구현하는 것입니다.
  8. 확장하는 유형과 동일한 서명 메소드가있는 확장 메소드를 작성하면 확장 메소드가 절대 호출되지 않습니다.

확장 메소드 관련 예