[c#] C #의 ‘=>’구문은 무엇을 의미합니까?

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

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



답변

람다 연산자입니다.

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 태그를 사용해보십시오 .)


답변

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

x => x + 1

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

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

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


답변

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

// 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을 선언 한 다음 해당 형식의 대리자 참조를 선언 한 다음 일치하는 서명이있는 익명 메서드가 할당됩니다.


답변

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

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

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


답변

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

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

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

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

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


답변

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

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();
}


답변

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

MyObjectReference => MyObjectReference.DoSomething()

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

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

예를 들면.