람다식에서 외부의 변수를 사용하거나 처리하는 경우 클로저로 처리함.
public class Func
{
public Action R = () => Console.WriteLine("0"); // 람다
public Action[] C; // 클로저
public Func()
{
C = new Action[5];
}
}
public class Execute
{
static void Main(string[] args)
{
Func func = new Func();
Console.WriteLine("----------[Ramda]----------");
func.R();
Console.WriteLine("----------[Closure1]----------");
for (int i = 0; i < 5; i++) // 하나의 i를 참조
func.C[i] = () => Console.WriteLine(i);
for (int i = 0; i < 5; i++)
func.C[i]();
Console.WriteLine("----------[Closure2]----------");
for (int i = 0; i < 5; i++)
{
int tmp = i; // 새로 만들어진 tmp를 참조
func.C[i] = () => Console.WriteLine(tmp);
}
for (int i = 0; i < 5; i++)
func.C[i]();
}
}
출력 결과
----------[Ramda]----------
0
----------[Closure1]----------
5
5
5
5
5
----------[Closure2]----------
0
1
2
3
4
람다식 처리 👉 static 메소드
클로저 처리 👉 Nested 클래스 생성
1.
for (int i = 0; i < 5; i++)
func.C[i] = () => Console.WriteLine(i);
=
public class ClosureClass
{
public int idx;
public void Print()
{
Console.WriteLine(idx);
}
}
2.
for (int i = 0; i < 5; i++)
func.C[i]();
=
static void Main(string[] args)
{
ClosureClass cc = new ClosureClass();
cc.idx = 0;
cc.idx = 5;
for (int i = 0; i < 5; i++)
cc.Print();
}