C #의 '=>'구문은 무엇을 의미합니까?


81

이 포럼의 일부 질문에서이 구문을 살펴 보았지만 Google과 다른 검색 엔진은 검색에서 문자와 숫자를 제외한 모든 것을 차단하는 경향이 있으므로 "=>"를 검색하는 것은 불가능합니다.

누구든지 그것이 무엇이며 어떻게 사용되는지 말해 줄 수 있습니까?


답변:


84

람다 연산자입니다.

C # 3부터 C # 5까지는 람다 식 에만 사용되었습니다 . 기본적으로 C # 2에 도입 된 익명 메서드 의 더 짧은 형식 이지만 식 트리 로 변환 할 수도 있습니다 .

예로서:

Func<Person, string> nameProjection = p => p.Name;

다음과 같습니다.

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

두 경우 모두 Person매개 변수가 있는 델리게이트를 생성하여 해당 사람의 이름 (문자열)을 반환합니다.

C # 6에서 동일한 구문에 사용되는 식 바디 부재 , 예를 들면

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

또한보십시오:

(실제로 많은 유사한 질문 -lambdalambda-expressions 태그를 사용해보십시오 .)


1
질문에 대한 정확한 사례에 대해 아무것도 말하지 않기 때문에 새로운 표현식 본문 멤버 구문도 포함하도록이 답변을 업데이트하는 것이 좋습니다.
라세 V. 칼슨

1
Nice :)이 질문이 중복 종료의 대상으로 사용 되었기 때문에 여기에 왔기 때문에 다른 경우에 다른 질문을 찾는 대신 1 개의 답변이 있으면 좋을 것이라고 생각했습니다
.

14

그것은 굉장함을 의미합니다. 예를 들어

x => x + 1

x를 매개 변수로 취하고 그 후속자를 리턴하는 메소드를 나타냅니다.

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

MethodInfo가 보유한 메서드를 호출하여 단추에 이벤트 처리기를 할당합니다.


14

훨씬 더 간결한 방법 표기법입니다. 다음은 대략 동일합니다.

// explicit method
int MyFunc(int pParam) {
   return pParam;
}

// anonymous (name-less) method
// note that the method is "wrapped" up in a hidden object (Delegate) this way
// so there is a very tiny bit of overhead compared to an explicit method
// (though it's really the assignment that causes that and would also happen
// if you assigned an explicit method to a reference)
Func<int, int> MyFunc = delegate (int pParam) { return pParam; };

// lambda expression (also anonymous)
// basically identical to anonymous method,
// except with everything inferred as much as possible, intended to be minimally verbose
Func<int, int> MyFunc = x => x;

// and => is now also used for "expression-bodied" methods
// which let you omit the return keyword and braces if you can evaluate
// to something in one line
int MyFunc(int pParam) =>
   pParam;

람다식이 "주어진 것, 무언가를 돌려 준다"라고 말하는 것으로 생각하십시오. 위의 예에서 람다 식은 x => x"given x, return x"라고 말하지만 람다 식은 반드시 무언가를 반환 할 필요는 없습니다.이 경우 "given x, do something with x"로 읽을 수 있습니다.

또한 처음에는 매우 혼란 스러울 수있는 "대리자"라는 세 가지가 있습니다.

익명 메서드는 delegate키워드를 사용 하지만 이름이없는 메서드를 정의합니다.

Func<int, int> = delegate (int x) { return x; };

참조에 메서드 (익명, 명시 적 또는 람다)를 할당하면 메서드를 참조 Delegate할 수 있는 숨겨진 래퍼 개체가 생성됩니다. (기본적으로 일종의 "관리 함수 포인터"입니다.)

그런 다음 키워드를 사용하여 명명 된 메서드 서명 을 선언 할 수도 delegate있습니다.

public delegate int TestFunc(int x, int y);

TestFunc myFunc = delegate (int x, int y) { return x + y; };

이것은 TestFunc두 개의 ints를 받고를 반환 하는 명명 된 서명 int을 선언 한 다음 해당 형식의 대리자 참조를 선언 한 다음 일치하는 서명이있는 익명 메서드가 할당됩니다.


10

다음은 msdn의 간단한 예입니다.

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

=> 앞의 것은 입력 매개 변수이고 그 이후의 것은 표현식입니다. 여러 입력 매개 변수를 가질 수 있습니다. Lambda는 주로 Linq와 함께 사용됩니다.


8

다음과 같은 익명 메서드를 사용하는 대신 :

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

다음과 같이 작성하면됩니다.

somevar.Find(n => n < 10);

반환 값에 따라 데이터 유형을 사용합니다.


3

=> 토큰은 두 가지 형태로지지되어 다음과 같은 람다 연산자 와 같은 분리 멤버 이름 및 발현 체 정의의 멤버 구현.

Lambda 연산자

람다 식에서 람다 연산자 =>는 왼쪽의 입력 변수와 오른쪽의 람다 본문을 구분합니다.

다음 예제에서는 메서드 구문과 함께 LINQ 기능을 사용하여 람다 식의 사용법을 보여줍니다.

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

식 본문 정의

표현식 본문 정의에는 다음과 같은 일반 구문이 있습니다.

member => expression;

여기서 expression은 유효한 표현식입니다. expression은 멤버의 반환 형식이 void이거나 멤버가 생성자, 종료 자 또는 속성 집합 접근자인 경우에만 문식이 될 수 있습니다.

다음 예제는 Person.ToString 메서드에 대한 식 본문 정의를 보여줍니다.

public override string ToString() => $"{fname} {lname}".Trim();

다음 메서드 정의의 축약 버전입니다.

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

4
다른 웹 사이트의 답변을 복사하여 붙여 넣으려면 최소한 출처 링크를 포함하세요 .
Knelis

1

기본적으로 매개 변수처럼 "들어간다"를 의미합니다.

MyObjectReference => MyObjectReference.DoSomething()

일반적으로 함수를 매개 변수로 메서드에 전달하거나 LINQ 문에서 사용합니다.

MyCollection.Where(myobj => myobj.Age>10)

예를 들면.


0

람다 식 구문의 일부입니다. 람다 식은 기본적으로 대리자 또는 익명 메서드의 축약 된 형식입니다. 설명을 위해 알파벳 문자와 일치하는 문자열 배열이 있다고 가정합니다. 다음 LINQ 식을 사용하여 "E"보다 큰 값을 포함하는 해당 배열의 멤버를 선택할 수 있습니다.

var someLetters = alphabet.Where (l => l> "E");

"=>"의 왼쪽에있는 람다 식의 일부는 테스트의 변수 이름 (알파벳의 개별 멤버로 설정 됨)을 식별하고 "=>"의 오른쪽에있는 람다 식의 일부는 처리. 이 경우 처리는 Where 논리가 알파벳의 각 멤버가 someLetters 배열로 전달되는지 확인하는 데 사용하는 부울 값을 생성합니다.

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