for 문에서 AddListener 람다식은 주의해야한다. (AddListener for loop) 클로저 Closure problem

 

#. 문제는 무엇인가?

버튼을 배열로 선언해놓고

for문에서 AddListener로 할당하려고 했는데, 

모두 마지막 값으로 초기화되는 현상이 있었다.

for (int i = 0; i < Btns.Length; i++)
{
    Btns[i].onClick.AddListener(() => PressBtnSelectGame(i));
}

 

이렇게 작성하면
0, 1, 2 .. 순서대로 초기화 되지 않는다!

 

#. Closure Problem

람다식이 실제 실행 되기 전에는 내부 변수를 참조형태로 가지고 있다.

for문을 돌리면서 같은 변수인 i를 계속 줬기 때문에 마지막 값으로 통일된 것.

이를 Closure problem이라고 부른다.

 

자세한 내용은 다음의 링크를 참고하자.

https://stackoverflow.com/questions/271440/captured-variable-in-a-loop-in-c-sharp

 

Captured variable in a loop in C#

I met an interesting issue about C#. I have code like below. List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add((...

stackoverflow.com

 

 

아래와 같이 수정하면 된다. (혹은 각각을 직접 숫자를 넣어 하드코딩으로 써주자)

for (int i = 0; i < Btns.Length; i++)
{
    int temp = i; // Closure 문제때문에 복사해서 사용한다.
    Btns[temp].onClick.AddListener(() => PressBtnSelectGame(temp));
}

 

 

 

'C# Study > C# 케이스 스터디' 카테고리의 다른 글

Construct (생성자) 오버로딩  (0) 2019.12.12
ReadOnlyCollection  (0) 2019.12.12
List<T> Sort  (0) 2019.12.10
확장 메서드  (0) 2019.10.02
C# 글자 표기 문자 형식 string.Format / ToString  (0) 2019.09.07

댓글

Designed by JB FACTORY