2011-01-10 6 views
34

C# 응용 프로그램의 정적 유틸리티 클래스보다 확장 메서드를 사용하여 장단점을 찾고 있습니다.확장 메서드 대 정적 유틸리티 클래스

예를 들어, 확장 메서드 열에있는 더하기는 "StringUtils"와 같은 것이 아니라 클래스 이름으로 호출하는 것에 대한 편의성입니다. 그러나 프레임 워크에있는 것과 그렇지 않은 것 사이의 경계가 흐려질 수 있습니다.

+0

[C#에서 확장 메서드를 사용할 때의 비용/이점 평가] => 3.0] (http : // stackoverflow.com/questions/1644743/evaluation-cost-benefits-of-c-extension-methods-in-c-03-0) –

+0

비슷한 질문이 여기에 게시되었습니다 : http://stackoverflow.com/questions/487904/what- advantage-of-extension-methods-have-you found 및 여기에 : http://stackoverflow.com/questions/1644743/evaluating-cost-benefits-of-using-extension-methods-in-c-3-0 – HABJAN

답변

45

pro은 프레임 워크에있는 것과 그렇지 않은 것 사이에 선이 흐려진다는 것입니다. 프레임 워크 유형에서 작동하는 프레임 워크 코드만큼 자연스럽게 자신의 코드를 사용할 수 있습니다.

확장 메서드는 임의로 사용해서는 안됩니다. 물론 이 아닙니다. 정적 메서드는 확장 메서드가되어야합니다.

필자는이 방법이 논리적으로 첫 번째 매개 변수에서 "작동"하고 있는지 여부를 확인하려고합니다. 그것을 인스턴스 메서드로 포함 할 수 있다면 인스턴스 메서드로 이해할 수 있습니까?

당신이 알지 못하는 "con": 나중에 확장형이 동일한 매개 변수에 적용 할 수있는 동일한 이름의 인스턴스 메소드를 추가하면 호출 코드가 다음에 인스턴스 메소드 호출을 투명하게 시작합니다 다시 컴파일하십시오. 예를 들어 Stream은 .NET 4에서 CopyTo을 얻었습니다. 이전에 CopyTo 확장 메소드를 작성했는데 다음에 호출되지 않았습니다. 이 일이 발생하고 있다는 경고는 없으므로 경계해야합니다.

주의 사항 : 확장 방법은 모범 사례가 실제로 구축되기까지 충분히 길지 않았습니다. 모든 의견을 조심스럽게 검토해야합니다 (심지어는 특히 나 자신의 의견조차도).

+0

7 년 후 모범 사례가 수립 되었습니까? – Sipo

+1

@Sipo : 아니요 :) –

10

하루가 끝날 때 두 가지 방법 모두 정적 메서드를 사용합니다.

string foo = "bob"; 
StringUtils.DoSomething(foo); 

string foo = "bob"; 
foo.DoSomething(); 

유일한 차이점은 문법적이다. 그것은 개인적 취향과 코딩 표준으로 귀결됩니다. 때때로 메소드 이름은 정적 클래스 이름을 보지 못하도록 충분히 설명 할 수 있습니다. 다른 때에는 클래스 이름을 포함시키는 것이 더 합리적입니다.

마지막으로 확장 메서드를 정적 메서드로 호출 할 수도 있습니다!

string foo = "bob"; 
StringExtensions.DoSomething(foo); 

위의 코드는 두 번째 예와 동일한 코드를 사용하지만 다르게 호출됩니다. 이 마지막 딱지를 염두에두고, 확장 메서드로 정적 유틸리티 클래스를 만든 다음 원하는대로 호출 할 수 있습니다.

+5

사이드 노트로 : 구문 만이 유일한 차이는 아닙니다. 확장 메서드는 암시 적 변환을 사용하지 않고 정적 메서드는 암시 적 변환을 사용하지 않습니다. 나는. '긴 myLong; IntExtension.DoSomething (myLong)'은 정상적으로 작동하지만'myLong.DoSomething()'은 컴파일되지 않습니다. 확장 메소드에 대해서는 오히려 예상되는 동작이지만, 일반적인 정적 메소드와는 다릅니다. – NOtherDev

4

저는 개인적으로 Extension 메서드에서 제공하는 readability 및 chain 호출 (암시 적으로 읽기 쉽도록 제공)을 좋아합니다.

1) Readability: 
    bool empty = String.IsNullOrEmpty (myString) 
    //in comparison to 
    bool empty = myString.IsNullOrEmpty(); 

2) Chain calls: 
    var query = Enumerable.Range(0, 10) 
         .Where(x => x % 2 == 0) 
         .Reverse(); 
    //instead of 
    var query = Enumerable.Reverse(Enumerable.Where(Enumerable.Range(0, 10), x => x % 2 == 0)); 

실수로 실수로 인스턴스 멤버가 확장 메서드를 재정의 할 수 있습니다. 개인적으로 나는 이것을 좋아하지 않는다. 동일한 어셈블리에서 일어난다면 적어도 컴파일러는 비명을 질렀어야합니다.

관련 문제