C #의 정적 메소드에 대한 공식 매개 변수에서 "this"키워드 사용


286

다음과 같은 C # 코드의 여러 인스턴스를 보았습니다.

public static int Foo(this MyClass arg)

this이 경우 키워드의 의미에 대한 설명을 찾지 못했습니다 . 통찰력이 있습니까?


10
허용되는 답변 외에도 C # 확장 방법의 경우 공식 MSDN 설명서를 확인해야합니다 .
vulcan raven

4
확장 방법은 편리하지만 생성 / 사용시주의를 기울여야합니다. 공식 MSDN 문서 의 일반 지침에서 인용 : "일반적으로 확장 방법을 필요할 때만 드물게 구현하는 것이 좋습니다. ... 확장 방법을 사용하여 소스 코드를 변경할 수없는 유형을 확장하는 경우 유형 구현 변경으로 인해 확장 메소드가 중단 될 위험이 있습니다. "
크리슈나 굽타

그 뜻 가능한 것입니까? 그것이 내가 찾고있는 것이기 때문입니다.
facepalm42

답변:


274

이것은 확장 방법 입니다. 설명 은 여기를 참조하십시오 .

확장 메서드를 사용하면 개발자가 기존 CLR 형식의 공용 계약에 하위 메서드를 추가하거나 원래 형식을 다시 컴파일하지 않고도 새 메서드를 추가 할 수 있습니다. 확장 방법은 오늘날 동적 언어에서 널리 사용되는 "오리진 입력"지원의 유연성과 강력한 형식 언어의 성능 및 컴파일 타임 유효성 검사를 결합하는 데 도움이됩니다.

확장 방법은 다양한 유용한 시나리오를 가능하게하며 실제로 강력한 LINQ 쿼리 프레임 워크를 가능하게합니다.

그것은 당신이 전화를 할 수 있다는 것을 의미합니다

MyClass myClass = new MyClass();
int i = myClass.Foo();

오히려

MyClass myClass = new MyClass();
int i = Foo(myClass);

이를 통해 아래에 설명 된대로 유창한 인터페이스 를 구성 할 수 있습니다.


서브 클래 싱은 어렵다
Gerry

@Gerry-무슨 뜻인가요?
Preet Sangha

9
죄송합니다, 작은 풍자-요즘 많은 구문은 내가 알지도 못하는 문제를 해결하는 것으로 보입니다. 가독성은 매우 우선 순위가 높아야합니다.
Gerry

2
@Gerry를 정직하게 말하면 클래식 Blub Paradox 와 같은 소리 입니다. 요즘에는 구문이 많기 때문에 더 좋은 방법이 있는지 알지 못했거나이 구문이 멋진 작업을 수행하지 않아서 발생하지 않는 문제를 해결할 수 있습니다. ' 이것은 문제를 찾는 해결책입니다 '에 대한 대부분의 의견 은 실제로 ' 그 기능이 어떻게 작동하는지 모르겠 기 때문에 쓸모가 없어야합니다 '의 예입니다.
Myrddin Emrys

53

Scott Gu의 인용 된 블로그 게시물이 이를 잘 설명합니다.

나에게 질문에 대한 답은 그 게시물의 다음 진술에 있습니다.

위의 정적 메소드에 string 유형의 첫 번째 매개 변수 인수 앞에 "this"키워드가있는 방법에 유의하십시오. 이것은 컴파일러에게이 특정 확장 메소드가 "string"유형의 오브젝트에 추가되어야 함을 알려줍니다. IsValidEmailAddress () 메서드 구현 내에서 메서드가 호출되는 실제 문자열 인스턴스의 모든 공용 속성 / 메서드 / 이벤트에 액세스하고 유효한 전자 메일인지 여부에 따라 true / false를 반환 할 수 있습니다.


9
이것은 정답입니다. this메소드 서명에서 키워드 의 실제 목적이 무엇인지 실제로 설명하는 유일한 대답입니다 . 다른 답변은 "확장 방법입니다." 확장 방법 이이 답변을 읽을 때까지 확장 유형에 어떻게 "첨부"되는지 완전히 이해하지 못했습니다. 감사합니다!
Lews Therin

13

Preet Sangha의 설명 외에도
Intellisense는 확장 방법을 파란색 화살표로 표시합니다 (예 : "Aggregate <>"앞).

여기에 이미지 설명을 입력하십시오

당신은 필요

using the.namespace.of.the.static.class.with.the.extension.methods;

확장 메소드가 코드를 사용하는 코드와 다른 네임 스페이스에있는 경우 확장 메소드가 나타나고 사용 가능해야합니다.



4

나는 다른 날에 이것을 스스로 배웠습니다. this 키워드는 메소드가 클래스를 확장하는 것을 정의합니다. 예를 들어 MyClass에는 Foo라는 새로운 확장 메서드가 있습니다.이 메서드는 매개 변수를 허용하지 않고 int를 반환하며 다른 공용 메서드와 마찬가지로 사용할 수 있습니다.


1

"this"는 매개 변수 목록에서 다음 클래스를 확장합니다

따라서 아래의 메소드 서명에서 "this"는 "String"을 확장합니다. 라인은 메소드의 일반적인 인수로 함수에 전달됩니다. 공개 정적 문자열 [] SplitCsvLine (이 문자열 줄)

위 예제에서 "this"클래스는 내장 "String"클래스를 확장합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.