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.