2011-04-07 9 views
1

ASP.NET System.Web.UI.Page에 확장 메서드를 추가했습니다. 내 응용 프로그램의 모든 페이지가이 클래스에서 상속됩니다.확장 방법 -이 키워드를 사용해야합니까?

그러나 확장 방법에 액세스 할 수는 없습니다. MyMethod()을 사용하는 대신 this.MyMethod();을 입력해야합니다. 나는 this의 메소드/속성이 본질적으로 기본 범위에 있다고 생각했습니다. 나는 무엇을 이해하지 못합니까? 아니면 이것이 확장 방법의 미묘한 차이입니까?

답변

5

나는 의 메소드/속성이 원래 범위에 있다고 생각했습니다.

그들입니다. 그러나 확장 방법은 기본 범위에서 이 아니라 방법이 this입니다. 컴파일러가 제공하는 구문 설탕을 통해 액세스 할 수있는 정적 메서드입니다. 이 입력 ExtensionMethod의 범위가 당신이 현재하고있는 클래스의 확장 방법 인 경우 : 당신이 이미 알고 있지만, 단지 명확하게 생각하는

this.ExtensionMethod(); 

은 ...과 동일 :

SomeStaticClass.ExtensionMethod(this); 

this 필요는 매개 변수 ExtensionMethod-로 전달한다. 위의 첫 번째 방법은 컴파일러가이 작업을 수행하는 것입니다.

당연히, 그들은 컴파일러가 확장 메소드와 클래스 멤버를 기본 범위로 "가져 오는"다른 것들을 구현할 수있었습니다. 그들은 단지 선택하지 않았습니다. 개인적으로 나는 그것을 좋아한다. 하지만 주관적인 문제라고 생각합니다. 어쨌든, this을 입력하는 것을 싫어한다면, 그것은 단지 작은 성가심 일뿐입니다. 맞습니까?

using Namespace.Where.Extension.Method.Is.Located 

을 그리고 정적한다 확장 방법을 보관 유지하는 클래스를 잊지 마세요 :

+0

정확히 ... 확장 메서드가 정의 된 클래스는 정적이므로 결코 인스턴스를 가질 수 없으므로이 메서드의 사용은 메서드 본문에서 잘못되었습니다. –

+1

@Paul : 저는 그것이 OP가 요구하는 것이라고 생각하지 않습니다. 나는 그가 왜'T' 타입의 코드에 있고'T'에 대한 확장 메소드를 가지고 있다면 왜 this.MyMethod()'*를'T' * 대신에'T' *에 넣어야하는지 궁금합니다. 'MyMethod()'. –

+0

* 다시 두 번 질문하기 * 당신은 절대적으로 맞습니다 ... :) 내 의견은 어쨌든이 정확한 질문과 관련이 없습니다. –

0

확장 방법을 사용하기 위해 당신은 선언해야합니다.

2

이것은 확장 방법의 뉘앙스입니까?

예, 그렇습니다. (다른 사람들이 설명했듯이)

자격없이 메서드를 사용하려면 페이지에서 상속 받고 메서드를 포함하는 클래스를 만들 수 있습니다 (물론 첫 번째 매개 변수 빼기). 그런 다음 응용 프로그램의 각 페이지를 새 사용자 정의 페이지에서 상속받습니다.

관련 문제