2010-04-04 3 views
14
나는 우리가이 기능과 같은 확장 메서드의 매개 변수 앞에 (C# 언어) ........... 을 "이"키워드를 사용하는 이유 물어보고 싶은

:확장 메서드에서 "this"를 사용하는 이유는 무엇입니까?

public static int ToInt(this string number) 
    { 
     return Int32.Parse(number); 
    } 

내가 알고 우리는 그것을 사용해야 만하지만 왜 그런지 모르겠습니다.

+1

필자는 개인적으로 선호하는 속성이었을 것입니다. [Extends (typeof (foo)]와 비슷한 속성을 갖고 있으며 속성과 비슷한 value라는 암시 적 변수가 있습니다. 기존 키워드를 재사용하지 않아도 표현력이 풍부했을 것입니다. 개인적 의견은 – John

+0

입니다. Scott Hanselman은 "this"키워드의 중요성을 설명하는 문서 http://www.hanselman.com/blog/HowDoExtensionMethodsWorkAndWhyWasANewCLRNotRequired.aspx – Zaffiro

답변

9

이것이 컴파일러에게 처음 확장 방법이라는 것을 알려주는 방식이기 때문에. 그렇지 않으면 그냥 정상적인 정적 메서드. 나는 그들이 this을 선택 했으므로 새로운 키워드를 찾아 내고 오래된 코드를 깨뜨릴 필요가 없었습니다.

+1

그리고 VB.Net에서와 같이 ExtensionAttribute를 사용하여 메서드에 태그를 지정할 필요가 없었습니다. –

+2

C#은 더 훌륭한 구문 설탕을 가지고 있습니다. 그래서 그것이 내가 좋아하는 이유입니다. –

0

확장 메소드로 메소드를 식별하기 위해. 컴파일러는 어떻게 알 수 있습니까?

1

단순히 확장 메서드로 표시합니다.이 메서드는 확장 메서드로 메서드를 정의하기 위해 선택한 형식으로 일반 정적 메서드 (내부적으로는 어쨌든 호출되는 방식입니다)와 반대입니다. 이것은 컴파일러 (및 intellisense)의 경우에만 이며, 코드 아래에 정적 메서드를 직접 호출하는 것처럼 코드가 컴파일됩니다.

하는 방법에 대한이 정의 :

public static int ToInt(this string number) //extension 

그렇지 않으면 당신은 매우 IntelliSense를 포함 네임 스페이스에 정적 클래스의 모든 정적 메소드를 포함한이있을 것이다 : 필요한

public static int ToInt(string number) //non extension 

이 구별 될 탐탁지 않은.

1

를 주로는 C# spec가 확장 메소드를 정의하는 방법이기 때문이다. 참조 섹션 10.6.9

10.6.9 확장 방법 방법 확장 방법이라고되어 ​​ 방법 의 파라미터는 상기 제 개질제를 포함

, . 확장 메서드는 이 아닌 일반 클래스, 중첩되지 않은 정적 클래스에서만 선언 될 수 있습니다. 확장 메서드 인 의 첫 번째 매개 변수에는 수정자가 없으며 매개 변수 유형은 유형의 포인터 일 수 없습니다. 정보에 대한

6

, 여기 문맥-키워드로 this의 중요성은 그것이 새로운 키워드를 소개 방지하는 것이 대부분이다. 새 키워드를 도입 할 때마다 변수/유형 이름으로 사용했을 수있는 코드를 깨뜨릴 위험이 있습니다.

  • 충분히이가 그 불법 기존의 키워드 ...
  • ...이었을 것입니다 인스턴스 메서드
  • 관련을 나타내는에를 가까운 입니다 : this 몇 가지 유용한 기능을 가지고 있습니다 해당 위치에서 사용할 때

즉 코드가 깨졌습니다. 즉, 이 존재하지 않습니다. 키워드로 this의 검색을 넘어

, 그것은 컴파일러 단지 편리한 구문 및 수동 [Extension]을 추가하는 것보다 더 편리합니다. 그것도없이, 특별한 행동없이 정적 인 방법 일뿐입니다.

관련 문제