C#_ Unity Game programming
C# - 반복문에서 람다식 사용할 때 주의할 점
doyyy_0
2024. 4. 23. 23:01
람다식에서 변수를 캡처하는 것은 매우 유용하지만, 주의해서 사용해야 합니다. 특히 루프 내부에서 람다를 사용할 때는 각 이터레이션에 대한 독립적인 변수를 캡처해야 하며, 이를 위해 변수의 범위를 정확하게 설정해야 합니다. 그렇지 않으면 루프의 마지막 값만 캡처되는 문제가 발생할 수 있습니다. 다음은 이를 반영한 간단한 예제 코드입니다:
List<Action> actions = new List<Action>();
for (int i = 0; i < 5; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action(); // 같은 값을 출력합니다: 4 ,4 ,4 ,4, 4
}
이렇게 람다식에서 외부변수를 참조하게 되어, 루프문의 마지막 변수 기준으로 출력합니다. 따라서, 다음과 같이 수정해야합니다.
List<Action> actions = new List<Action>();
for (int i = 0; i < 5; i++)
{
int loopScopedVariable = i;
actions.Add(() => Console.WriteLine(loopScopedVariable));
}
foreach (var action in actions)
{
action(); // 각기 다른 값을 출력: 0, 1, 2, 3, 4
}
위 코드에서 각 루프의 이터레이션마다 새로운 loopScopedVariable이 생성되어, 각기 다른 람다식에서 참조됩니다. 이로 인해 람다식은 각기 다른 i의 값을 캡처하게 됩니다.
참조 :