[c#] 확장 방법의 장점은 무엇입니까? [닫은]

C #의 “믿지 않는”사람이 확장 메서드의 목적이 무엇인지 물었습니다. 그런 다음 이미 정의 된 객체에 새 메서드를 추가 할 수 있다고 설명했습니다. 특히 원본 객체에 대한 소스를 소유 / 제어하지 않는 경우 더욱 그렇습니다.

그는 “왜 자신의 수업에 메소드를 추가하지 않습니까?” 우리는 (좋은 방식으로) 빙글 빙글 돌았습니다. 내 일반적인 반응은 이것이 도구 벨트의 또 다른 도구라는 것입니다. 그의 반응은 도구의 쓸모없는 낭비라는 것입니다. 그러나 나는 더 “깨달은”대답을 얻을 것이라고 생각했습니다.

자신의 클래스에 추가 된 메서드를 사용할 수 없었거나 사용해서는 안되는 확장 메서드를 사용한 몇 가지 시나리오는 무엇입니까?



답변

확장 메서드는 코드를 작성할 때 많은 도움이된다고 생각합니다. 기본 유형에 확장 메서드를 추가하면 인텔리 센스에서 빠르게 얻을 수 있습니다.

파일 크기형식화 할 형식 공급자가 있습니다 . 그것을 사용하려면 다음과 같이 작성해야합니다.

Console.WriteLine(String.Format(new FileSizeFormatProvider(), "{0:fs}", fileSize));

다음과 같이 작성할 수있는 확장 메서드 만들기 :

Console.WriteLine(fileSize.ToFileSize());

더 깨끗하고 간단합니다.


답변

확장 메서드 의 유일한 장점은 코드 가독성입니다. 그게 다야.

확장 메서드를 사용하면 다음을 수행 할 수 있습니다.

foo.bar();

대신 :

Util.bar(foo);

이제 C #에는 이와 같은 많은 것들이 있습니다. 즉, C #에는 사소 해 보이고 그 자체로는 큰 이점이없는 많은 기능이 있습니다. 그러나 이러한 기능을 함께 결합하기 시작하면 부분의 합보다 조금 더 큰 것을 보게됩니다. 확장 메서드가 없으면 LINQ 쿼리를 거의 읽을 수 없으므로 LINQ는 확장 메서드의 이점을 크게 얻습니다. LINQ는 확장 메서드 없이는 가능 하지만 실용적이지는 않습니다.

확장 메서드는 C #의 부분 클래스와 매우 유사합니다. 그 자체로는별로 도움이되지 않고 사소 해 보입니다. 그러나 생성 된 코드가 필요한 클래스로 작업을 시작하면 부분 클래스가 훨씬 더 이해되기 시작합니다.


답변

툴링을 잊지 마세요! Foo 유형에 확장 메서드 M을 추가하면 Foo의 인텔리 센스 목록에 ‘M’이 표시됩니다 (확장 클래스가 범위 내에 있다고 가정). 이렇게하면 MyClass.M (Foo, …)보다 ‘M’을 훨씬 쉽게 찾을 수 있습니다.

하루가 끝나면 다른 정적 방법에 대한 통사론 적 설탕이지만 집을 사는 것과 같습니다 : ‘위치, 위치, 위치!’ 유형에 매달리면 사람들이 찾을 것입니다!


답변

내가 본 확장 방법의 두 가지 추가 이점 :

  • 유창한 인터페이스는 확장 메서드의 정적 클래스로 캡슐화 될 수 있으므로 핵심 클래스와 유창한 확장 간의 문제를 분리 할 수 ​​있습니다. 나는 더 큰 유지 보수를 달성하는 것을 보았습니다.
  • 확장 메서드는 인터페이스에서 중단 될 수 있으므로 컨트랙트 (인터페이스를 통해) 및 연관된 일련의 인터페이스 기반 동작 (확장 메서드를 통해)을 지정할 수 있으며 다시 우려 사항을 분리 할 수 ​​있습니다. 일례의 방법은 원하는 Linq에 연장되어 Select(...), Where(...)오프 등 기형 IEnumerable<T>인터페이스.


답변

확장 메서드에 대한 가장 좋은 용도 중 일부는 다음과 같은 기능입니다.

  1. 타사 개체의 기능을 확장합니다 (상업적이든 회사 내부이든 별도의 그룹에 의해 관리 됨). 대부분의 경우 sealed.
  2. 추상 클래스를 구현할 필요없이 인터페이스에 대한 기본 기능 생성

예를 들어, IEnumerable<T>. 확장 메서드가 풍부하지만 일반적인 ForEach 메서드를 구현하지 않은 것이 귀찮습니다. 그래서 나는 내 자신을 만들었습니다.

public void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach ( var o in enumerable )
    {
        action(o);
    }
}

Voila, IEnumerable<T>구현 유형에 관계없이 모든 객체, 내가 작성했는지 여부와 관계없이 이제 ForEach코드에 적절한 “using”문을 추가하여 메서드를 갖게 되었습니다.


답변

확장 메서드를 사용하는 가장 큰 이유 중 하나는 LINQ입니다. 확장 메서드가 없으면 LINQ에서 할 수있는 많은 작업이 매우 어려울 것입니다. Where (), Contains (), Select 확장 메서드는 구조를 변경하지 않고 기존 유형에 훨씬 더 많은 기능이 추가됨을 의미합니다.


답변

확장 방법 의 장점 에 대한 많은 답변이 있습니다 . 단점을 해결하는 방법은 어떻습니까?

가장 큰 단점은 동일한 컨텍스트에서 동일한 서명을 가진 일반 메서드와 확장 메서드가있는 경우 컴파일러 오류나 경고가 없다는 것입니다.

특정 클래스에 적용되는 확장 메서드를 생성한다고 가정합니다. 그런 다음 나중에 누군가 해당 클래스 자체에 동일한 서명을 가진 메서드를 만듭니다.

코드가 컴파일되고 런타임 오류가 발생하지 않을 수도 있습니다. 그러나 더 이상 이전과 동일한 코드를 실행하지 않습니다.