C# 응용 프로그램의 정적 유틸리티 클래스보다 확장 메서드를 사용하여 장단점을 찾고 있습니다.확장 메서드 대 정적 유틸리티 클래스
예를 들어, 확장 메서드 열에있는 더하기는 "StringUtils"와 같은 것이 아니라 클래스 이름으로 호출하는 것에 대한 편의성입니다. 그러나 프레임 워크에있는 것과 그렇지 않은 것 사이의 경계가 흐려질 수 있습니다.
C# 응용 프로그램의 정적 유틸리티 클래스보다 확장 메서드를 사용하여 장단점을 찾고 있습니다.확장 메서드 대 정적 유틸리티 클래스
예를 들어, 확장 메서드 열에있는 더하기는 "StringUtils"와 같은 것이 아니라 클래스 이름으로 호출하는 것에 대한 편의성입니다. 그러나 프레임 워크에있는 것과 그렇지 않은 것 사이의 경계가 흐려질 수 있습니다.
pro은 프레임 워크에있는 것과 그렇지 않은 것 사이에 선이 흐려진다는 것입니다. 프레임 워크 유형에서 작동하는 프레임 워크 코드만큼 자연스럽게 자신의 코드를 사용할 수 있습니다.
확장 메서드는 임의로 사용해서는 안됩니다. 물론 이 아닙니다. 정적 메서드는 확장 메서드가되어야합니다.
필자는이 방법이 논리적으로 첫 번째 매개 변수에서 "작동"하고 있는지 여부를 확인하려고합니다. 그것을 인스턴스 메서드로 포함 할 수 있다면 인스턴스 메서드로 이해할 수 있습니까?
당신이 알지 못하는 "con": 나중에 확장형이 동일한 매개 변수에 적용 할 수있는 동일한 이름의 인스턴스 메소드를 추가하면 호출 코드가 다음에 인스턴스 메소드 호출을 투명하게 시작합니다 다시 컴파일하십시오. 예를 들어 Stream
은 .NET 4에서 CopyTo
을 얻었습니다. 이전에 CopyTo
확장 메소드를 작성했는데 다음에 호출되지 않았습니다. 이 일이 발생하고 있다는 경고는 없으므로 경계해야합니다.
주의 사항 : 확장 방법은 모범 사례가 실제로 구축되기까지 충분히 길지 않았습니다. 모든 의견을 조심스럽게 검토해야합니다 (심지어는 특히 나 자신의 의견조차도).
7 년 후 모범 사례가 수립 되었습니까? – Sipo
@Sipo : 아니요 :) –
하루가 끝날 때 두 가지 방법 모두 정적 메서드를 사용합니다.
string foo = "bob";
StringUtils.DoSomething(foo);
및
string foo = "bob";
foo.DoSomething();
유일한 차이점은 문법적이다. 그것은 개인적 취향과 코딩 표준으로 귀결됩니다. 때때로 메소드 이름은 정적 클래스 이름을 보지 못하도록 충분히 설명 할 수 있습니다. 다른 때에는 클래스 이름을 포함시키는 것이 더 합리적입니다.
마지막으로 확장 메서드를 정적 메서드로 호출 할 수도 있습니다!
string foo = "bob";
StringExtensions.DoSomething(foo);
위의 코드는 두 번째 예와 동일한 코드를 사용하지만 다르게 호출됩니다. 이 마지막 딱지를 염두에두고, 확장 메서드로 정적 유틸리티 클래스를 만든 다음 원하는대로 호출 할 수 있습니다.
사이드 노트로 : 구문 만이 유일한 차이는 아닙니다. 확장 메서드는 암시 적 변환을 사용하지 않고 정적 메서드는 암시 적 변환을 사용하지 않습니다. 나는. '긴 myLong; IntExtension.DoSomething (myLong)'은 정상적으로 작동하지만'myLong.DoSomething()'은 컴파일되지 않습니다. 확장 메소드에 대해서는 오히려 예상되는 동작이지만, 일반적인 정적 메소드와는 다릅니다. – NOtherDev
저는 개인적으로 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));
실수로 실수로 인스턴스 멤버가 확장 메서드를 재정의 할 수 있습니다. 개인적으로 나는 이것을 좋아하지 않는다. 동일한 어셈블리에서 일어난다면 적어도 컴파일러는 비명을 질렀어야합니다.
[C#에서 확장 메서드를 사용할 때의 비용/이점 평가] => 3.0] (http : // stackoverflow.com/questions/1644743/evaluation-cost-benefits-of-c-extension-methods-in-c-03-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