지난 포스트에 이어서...
var list = new List<int>(10);
var menu = new ToolStripMenuItem("메뉴");
for(int i=0; i<list.Count; i++) {
var subMenu = new ToolStripMenuItem("메뉴 항목");
subMenu.Click += ( (sender, args)=>{ subMenu_Click(sender, i); } ); // closure
}
void subMenu_Click(object sender, int idx)
{
MessageBox.Show(string.Format("{0}이 클릭됨", idx));
}
예상되는 결과는? i번째 subMenu를 누르면 i가 출력되지 않는다.
다음과 같이 변수를 한 번 복사하는 게 해결책이다:
for(int i=0; i<list.Count; i++) {
var subMenu = new ToolStripMenuItem("메뉴 항목");
int j=i; // 이거면 되지 않을까 했는데 진짜 됐음-_-乃
subMenu.Click += ( (sender, args)=>{ subMenu_Click(sender, j); } ); // closure
}
해결하고 나서 stackoverflow에 질문을 올렸는데
Google: passing parameter evenhandler value changes C#
이걸로 검색하니까 금방 나옴.
역시 원리는 안 찾아보고 하니까 이유는 모른다.
아래 링크에 이유가 있다고 하는데 읽기는 귀찮다.
http://stackoverflow.com/questions/2226510/closures-in-c-sharp-event-handler-delegates
http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop
Subscribe to:
Post Comments (Atom)
"Gossip Girl" star Michelle Trachtenberg dies at 39
미셸 트랙튼버그 하우스에서 심장 이식 받았던 환자로 나왔는데 현실에서는 간이식을 받았었구나 가십걸이나 버피더뱀파이어슬레이어 이제 정주행해 볼까... 블로그도 다시 살려 볼까 훠훠

-
텍스트박스에서 엔터를 치면 자동으로 입력되게 하려고 keyup 이벤트 핸들러를 등록했다. 잘 동작하는 듯했는데 alert창을 닫아도 닫아도 계속 열리는 것이다. 크롬이어서 다행이지 IE였으면 무한히 열렸을 거야...스페이스바로 눌러보길 잘했...
-
MathJax è Word MS Word 2007부터는 MathML을 문서에 바로 붙여넣을 수 있다. 이 블로그의 거의 대부분의 수식은 MathJax로 작성되어 있는데, 오른쪽 버튼 클릭하고 메뉴에서 MathML 또는 TeX 형식으로 ex...
-
진짜 되는 건 아니고 흉내낼 수는 있다. 새 창을 누르면 아무 것도 안 변한 것 같지만 PowerPoint 창 제목이 바뀌어 있다: 프레젠테이션1:2에서 :2 부분이 같은 파일을 연 창 여러 개 중 2번째라는 뜻이다('프레...
No comments:
Post a Comment