2009-04-04 2 views
11

C# 확장 메서드의 첫 번째 매개 변수는 확장 메서드가 호출 된 인스턴스입니다. 나는 다른 곳에서 그것을 보지 않고, 그 변수를 "자아"라고 부르는 관용어를 채택했다. 다른 사람들도 그걸 사용하고 있다면 놀랄 일은 아닙니다. 다음은 예입니다 :C#의 확장 메서드에 "this"매개 변수를 지정하는 관용구 (있는 경우)는 무엇입니까? 그 이유는 무엇입니까?

public static void Print(this string @this) 
{ 
    if(@this != null) Console.WriteLine(@this); 
} 

를 그리고 제 3의 옵션으로, 일부는 전혀 관용구를 선호하지 : 그러나

public static void Print(this string self) 
{ 
    if(self != null) Console.WriteLine(self); 
} 

, 나는 다음과 같이 다른 사람이 해당 매개 변수 "@this를"이름을보고 시작 해요 "자기"와 "@"는 어떠한 정보도 제공하지 않는다고 말했습니다. 나는 우리 모두가 가끔에 동의한다고 생각합니다. 매개 변수의 목적에 명확하고 의미있는 이름이 있습니다.이 이름은 "self"나 "@this"보다 낫습니다. 어떤 사람들은 더 나아가서 항상이 더 가치있는 이름을 내놓을 수 있다고 말합니다. 그래서 이것은 또 다른 유효한 관점입니다.

다른 숙어를 본 적이 있습니까? 당신은 어떤 관용구를 선호하며, 왜 그런가요?

답변

3

나는 obj와 val을 사용했다. 나 이거 싫어해. 키워드 사용을 피하도록 노력해야합니다. 나는 자기를 본 적이 없지만 나는 그것을 좋아한다. 당신은 이런 일을 할 수

+0

나는 키워드를 사용하지 않기를 동의하는 경향이있다. –

+0

@ 이것은 (은) 키워드가 아닙니다. –

+0

키워드를 이스케이프 처리하기 위해 @을 사용합니다. 키워드입니다. – JoshBerke

1

...

public static void Print(this string extended) 
{ 
    if(extended != null) Console.WriteLine(extended); 
} 
+0

아니, 할 수 없었다 :) "일관되게"또는 "확장 된"일관성을 사용하라는 의미였습니까? –

+0

그는 단지 당신이 오타가 있다고 지적하고 있습니다. 한 곳에서는 여전히 "@"를 사용하고 다른 한 곳에서는 "확장"을 사용합니다. –

+0

잡아 주셔서 감사합니다 ... – bytebender

16

나는 사용을 기반으로, 상당히 일반적으로 이름을 지정하십시오. LINQ 연산자의 소스 시퀀스에 대한 "소스"또는 매개 변수/인수 검사 등을 수행하는 확장에 대한 "인수"/ "매개 변수"

"이 "또는"self "-이 매개 변수의을 의미하는 에 대한 추가 정보를 제공하지 않습니다. 확실히 그것이 가장 중요한 것입니다.

편집 :에도 분명 많은 의미가 아니다 경우에, 나는 없음에 의미를 몇 가지을 선호하는 것입니다. "self"또는 "@this"는 어떤 정보를 제공합니까? 확장 메서드의 첫 번째 매개 변수 일 뿐이며 매개 변수가 this으로 장식되어 있기 때문에 정보가 이미 분명합니다. theStringToPrint/self 옵션이 주어지는 예제에서는 대신 outputText을 사용합니다.이 매개 변수는 IMO 매개 변수에 대해 알아야 할 모든 것을 전달합니다.

+0

많은 경우, 나는 당신과 동의합니다. 그러나 종종 확장 메서드는 너무 일반적이어서 "theStringToPrint"와 같은 것보다 더 좋은 이름은 없습니다. 이 2 가지 경우를 구별하기 위해 내 게시물을 편집 할 것입니다. –

+0

나는 그것을 커버하기 위해 나의 대답을 편집 할 것이다. :) –

+0

차갑다. 나는 확신한다고 말할 수는 없지만, 당신은 확실히 합리적인 견해를 가지고 있습니다. 나는 두 가지 방법으로 확장 메소드를 작성했다는 것을 알고있다. 의미있는 이름이있을 때 그것을 사용합니다. 그러나 내가 줄 수있는 최선의 정보가 "자기 같은"매개 변수라는 느낌이들 때가 많이 있습니다. –

2

확장 메서드가 해당 매개 변수에서 작동하므로 '대상'이라고합니다.

+0

예! 단위 테스트와 동일하게, 이것은 운영 방법의 목표입니다. 대부분의 메서드는 명시 적으로 목표로하는 정확한 "대상"을 갖고 있지 않지만 단위 테스트 및 정적 메서드는이를 수행합니다. 메소드의 전체 목적은 하나의 객체이므로 메소드의 대상입니다. –

2

필자가 보아본 가장 쓸모없는 언어 별 기능 (@)을 사용하기 때문에 @ 피해야한다고 생각합니다. 실제로 키워드가 아닌 곳에 나타나는 키워드와 같이 혼동을 유발하거나 가독성을 저하시킬 수있는 요소는 피해야합니다. 자체는 파이썬을 생각 나게하지만 일관성있는 명명 규칙에 도움이 될 수 있습니다. 왜냐하면 사용중인 인스턴스를 언급하고있는 반면 명확한 구문상의 속임수가 필요하지는 않기 때문입니다.

4

평범한 오래된 고정 방법 인 경우 변수의 이름을 정확하게 지정합니다. 그 이유는 여전히 정적 메서드로 호출 될 수 있으며 코드에서 해당 유스 케이스를 고려해야하기 때문입니다.

가장 쉬운 방법은 인수 유효성 검사입니다.null이 메소드에 전달되는 경우를 고려하십시오. 인수 검사를 수행하고 ArgumentNullException을 던져야합니다. 제대로 구현되면 "this"를 인수 이름으로 사용해야합니다.

public static void Print(this string @this) { 
    if (null == @this) { 
    throw new ArgumentNullException("this"); 
    } 
    ... 
} 

누군가 이제 라이브러리에 대해 코딩 중이며 "this is null"이라는 예외 대화 상자가 갑자기 나타납니다. 그들은 가장 혼란스러워 할 것입니다 :

이것은 약간의 인위적인 예입니다. 그러나 일반적으로 나는 일반적인 구식 정적 방법과 다른 확장 방법을 사용합니다. 나는 그들이 그것을 쉽게 추론 할 수있게 만든다.

관련 문제