C#에서 대리자의 발전
원 내용은 링크에 있고 대충 이렇단다.1
1.0때 명시적 delegate가 나왔고,
2.0때 명시적일 필요가 없는 Anonymous Method 가 나오고
3.0때 Lambda Expressions이 나왔다고 한다.위 둘은 봤으니 마지막 Lambda expressions 차례.
Lambda expressions
- 이런 식을 lambda expressions 라고 한다.
- 식 람다 : 식이 본문으로 보함된 형식
(input-parameters) => expression - 문장 람다 : 문 블록이 본문으로 포함된 형식
(input-parameters) => {<sequence-of-statements>}
- 식 람다 : 식이 본문으로 보함된 형식
- 근데 둘이 다른점이 뭐임???
한줄이면 식이고 블록이면 문단임?? - ex
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
class lambda_1 { delegate void test_del(); test_del test; public lambda_1() { test = () => { Console.WriteLine("test_1"); }; test(); test += () => { Console.WriteLine("test_2"); }; test(); test_del tt = () => { Console.WriteLine("test_3"); }; tt(); Action act_1 = () => { Console.WriteLine("act_1"); }; act_1(); Action act_2 = () => Console.WriteLine("act_2"); act_2(); Func<int, int, int> func_1 = (int a, int b) => { return a * b; }; Console.WriteLine(func_1(10, 12)); Func<int, int> func_2 = (int a) => a * a; Console.WriteLine(func_2(10)); } }
1 2 3 4 5 6 7 8
test_1 test_1 test_2 test_3 act_1 act_2 120 100
- 일단, 식이건 블록이건 별 다른게 없어보이고(act_1 vs act_2)
delegate에서 뻗어나와서 그런지 Action, Func 사용이 자유로움
anonymous method에서 delegate를 빼고
(parameter) => (식) 이렇게 간소화한 표현으로 보임.
etc
- 위 까지 기본 설명. 사용법은 사실 저정도로 짧게 끝나는듯.
- 여기는 그 외 설명인데 MSDN에서 따로 설명한 부분들이 많아서
그냥 정리하고 넘어가려함.2 - 순서대로 봤다면 지금까지 설명에 없던 개념들이 나오는데
관련 내용은 추후에 정리를 하던가 직접 찾아봐야할것같음.- 미래의 나에게.
- 나머지는 나중에 보고 필요하다 생각되면 또는 이해가 된다면 정리함.
Async Lambdas.
async 및 await 으로된 비동기 이벤트도 간단히 할 수 있다?
그러니까 이걸
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += button1_Click; } private async void button1_Click(object sender, EventArgs e) { await ExampleMethodAsync(); textBox1.Text += "\r\nControl returned to Click event handler.\n"; } private async Task ExampleMethodAsync() { // The following line simulates a task-returning asynchronous process. await Task.Delay(1000); } }
이렇게
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += async (sender, e) => { await ExampleMethodAsync(); textBox1.Text += "\r\nControl returned to Click event handler.\n"; }; } private async Task ExampleMethodAsync() { // The following line simulates a task-returning asynchronous process. await Task.Delay(1000); } }
Lambda expressions and tuples
- C# 7.0부터 C# 언어에서 튜플을 기본적으로 지원.
- 람다 식에 인수로 튜플을 제공할 수 있으며
람다 식에서 튜플을 반환할 수도 있음. - 경우에 따라 C# 컴파일러는 형식 유추를 사용하여
튜플 구성 요소의 형식을 확인할 수 있다. - 쉼표로 구분된 해당 구성 요소 목록을
괄호로 묶어 튜플을 정의함. - ex
1 2 3 4 5 6
Func<(int, int, int), (int, int, int)> doubleThem = ns => (2 * ns.Item1, 2 * ns.Item2, 2 * ns.Item3); var numbers = (2, 3, 4); var doubledNumbers = doubleThem(numbers); Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}"); // Output: // The set (2, 3, 4) doubled: (4, 6, 8)
- 3개 구성 요소가 있는 튜플을 사용하여
숫자 시퀀스를 람다 식에 전달하고
각 값을 두 배로 늘린 후 곱하기의 결과가 포함된
3개 구성 요소가 있는 튜플을 반환.
- 3개 구성 요소가 있는 튜플을 사용하여
- ex
1 2 3 4 5
Func<(int n1, int n2, int n3), (int, int, int)> doubleThem = ns => (2 * ns.n1, 2 * ns.n2, 2 * ns.n3); var numbers = (2, 3, 4); var doubledNumbers = doubleThem(numbers); Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}");
- 일반적으로 튜플 필드의 이름은 Item1, Item2 등입니다.
그러나 다음 예제에서처럼 명명된 구성 요소가 있는 튜플을 정의 가능.
- 일반적으로 튜플 필드의 이름은 Item1, Item2 등입니다.
Comments powered by Disqus.