이 포럼의 일부 질문에서이 구문을 살펴 보았지만 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();
또한보십시오:
(실제로 많은 유사한 질문 -lambda 및 lambda-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
두 개의 int
s를 받고를 반환 하는 명명 된 서명 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)
예를 들면.