Microsoft MVP성태의 닷넷 이야기
C# list.Clear() 호출에 대한 문의 드립니다. [링크 복사], [링크+제목 복사],
조회: 5292
글쓴 사람
김현진 (kutgw at naver.com)
홈페이지
첨부 파일
 

안녕하세요.
사이트는 자주 방문하여 좋은 정보를 많이 얻었으나, 이렇게 문의 글을 올리는 것은 처음이네요.


응용프로그램 개발을 하는 중에 추가하고 싶은 기능이 생겨 함수를 작성하였는데,
생각처럼 동작이 되질 않았습니다. 디버깅을 통해 해결을 하였으나, 왜 그런지에 대한 이유를 알고싶어 문의를 드리게 되었습니다.
(개발환경은 Visual Studio 2019 , .NET Framework 4.7.2 입니다.)

아래의 내용은 xml 파일 내용을 읽어들이며 Dictionary 에 저장하는 함수인데,
foreach 문의 Loop 를 도는 중에 pcblist.Clear() 가 호출될 경우에는 Dictionary에 저장한 list 자료가 남아있지만,
foreach 문 Loop 마지막에서 pcblist.Clear() 호출될 경우에는 이미 저장한 Dictionary의 list 자료까지 모두 Clear가 됩니다.


public bool LoadDictionary()
{
    string path = Path.Combine(DataRootPath, "MagazineDictionary.xml");
    XDocument xdoc = XDocument.Load(path);
    
    List<PCB> pcbList = new List<PCB>(16);

    int pcbCount = 0;
    int magzineCount = xdoc.Descendants("Magazine").Count();
    if (magzineCount == 0)
    {
        return false;
    }

    foreach (XElement elem in xdoc.Descendants().Where(a => !a.HasElements))
    {
        var pcb = new PCB()
        {
            ID = elem.Attribute("ID").Value,
            No = elem.Attribute("No").Value,
            Status = Convert.ToInt32(elem.Attribute("Status").Value)
        };
        pcbList.Add(pcb);
        pcbCount++;

        if (pcbCount != 16)
        {
            continue;
        }

        if (!MD.ContainsKey(elem.Parent.Attribute("ID").Value))
        {
            MD.Add(elem.Parent.Attribute("ID").Value, new MGZ()
            {
                ID = elem.Parent.Attribute("ID").Value,
                No = elem.Parent.Attribute("No").Value,
                PCB_List = pcbList
            });
        }
        
        pcbCount = 0;
        pcbList.Clear();
    }
    return true;
}

MD 라는 Dictionary 에 저장한 Data 가 3개라면, 2개까지는 모두 정상적으로 Dictionary 에 저장됩니다.
마지막 3번째 Data 를 저장하고, list.Clear() 가 호출된 후 foreach 문을 빠져나오면 Dictionary 에 저장되어있는
PCB_List 가 모두 삭제가 됩니다.


프로그램을 시작한지 얼마되지 않아 많이 부족하네요.
이유에 대한 설명 좀 부탁드리겠습니다.

감사합니다.








[최초 등록일: ]
[최종 수정일: 11/21/2021]


비밀번호

댓글 작성자
 



2021-11-21 05시36분
"PCB_List = pcbList"는 리스트의 목록이 복사되어 대입되는 것이 아닙니다. 단순히 PCB_List의 속성은 pcblist에 대한 참조값만을 담고 있는 것이기 때문에, pcblist.Clear를 해버리면 PCB_List.Clear를 호출한 것과 동일합니다. (그나저나, 원하는 것이 무엇인지 저 코드만 봐서는 잘 눈에 들어오지 않는군요. ^^;)
정성태
2021-11-21 06시36분
[김현진] 안녕하세요. 답변 감사드립니다.
디버깅하는 걸 캡쳐하여 첨부하고자 하였는데 문의글 수정이 안되네요.
말씀하신 것처럼 참조값만 담고 있어 pcblist.Clear를 해버리면 위 코드 상 PCB_List 에는 값이 항상 없어야 정상인 것으로 이해됩니다.
하지만, foreach 문의 loop 마지막에서 pcblist.Clear 가 호출될 때에만 PCB_List의 값이 모두 clear 가 되어 의문이 들었습니다.
해결한 방법도 loop 마지막에서 pcblist.Clear 가 호출되지 않도록 하였습니다.

귀한 시간 할애 해주셨는데, 설명이 부족하여 정확한 답볍을 들을 수가 없었네요. 죄송합니다.
좀 더 자세한 설명과 첨부 자료를 준비하여 다시 문의를 드리도록 하겠습니다.
[guest]
2021-11-22 09시43분
프로그램의 의도를 파악할 수 없어 잘은 모르겠지만. 그리고 foreach 문의 loop 마지막이라는 것은 루프 밖을 의미하는 것인지, 루프를 벗어나기 바로 전을 의미하는 것인지 질문의 의도가 불명확한 것도 있고요.

그냥 loop 마지막이라는 것을 loop를 벗어나서 pcblist.Clear를 호출한 걸로 가정해 보겠습니다.

그런 경우, 중간에 pcbCount != 16 / continue 조건에 의해 16번째에 해당하는 pcbCount가 오지 않는 한 루프 벗어나기 전의 pcblist.Clear가 호출되지 않으므로 MD에 있는 값이 남아 있는 것 아닌가요?

혹시 다음에 질문하시거든, 재현 가능한 예제를 첨부해주세요.
정성태
2021-11-22 05시22분
[김현진] 편법으로 pcblist.Clear() 호출을 막았던 것이 정확한 방법이 아니라는 생각에 코드를 다시 작성하여 해결하였습니다.

질문 내용이 명확하지 않다면, 답변을 들을 수 없다는 것을 다시 한 번 배웁니다.
다음에 질문 시에는 좀 더 명확한 내용과 예제로 질문하도록 하겠습니다.
감사합니다.
[guest]

... 31  [32]  33  34  35  36  37  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
5072엔벌잉10/24/20188120C# textbox, button질문입니다! [4]파일 다운로드1
5071엔벌잉10/23/20188509C#윈도우폼 질문입니다!! [2]
5070진우10/17/20188474Visual Studio 서비스팩과 업데이트 차이 문의 [2]
5069감자10/12/20189207빌드 구성을 재설정하는 방법이 있을까요? [1]파일 다운로드1
5068누오10/10/20187992ASP Core 2.0 에서 dll안에 있는 뷰 읽어들이는 방법? [1]
5067김정민10/5/20187981다른 윈도우가 깨지는 현상을 막을 수 있을까요 [3]
5066로니브10/4/20188789ASP.NET MVC에서 View 파일 숨기는법? 보안처리 하는법? 관련 질문.. [1]
5065키모10/1/20189986문자 질문입니다. [3]
5064로니브10/1/20189333클래스 라이브러리에서 .cshtml파일을 추가하는 방법은 없나요? [3]
5063진우9/28/20188396ADO.net 과 Entity Framework 차이 문의 [2]
5062테스트9/27/20188908C# import file 의 구조체 배열 선언 및 호출에 대해 문의. [3]
5061안녕하세요9/13/20188899c# 프로그래밍 관련 문의 [1]
5060임민재9/8/20188391c# install 파일 생성 시 문제가 발생하였습니다 [1]파일 다운로드1
50599/7/20188025Winform TextBox 포커스 유지하는 방법 질문 [파일첨부] [1]파일 다운로드1
50589/5/201811438Winform TextBox 포커스 유지하는 방법 질문 [3]
5056박종윤8/30/201810757c# dll을 C++에서 사용 시 event 호출 [4]파일 다운로드1
5055초보자8/29/20189429asp.net 에서 다른 서버의 iis를 stop하는 batch file을 실행시키는데 동작하지 않습니다. [5]
5054사도신8/29/20188128[wpf] textbox insert overite 모드시에 [4]파일 다운로드1
5053엿장수8/26/20187475directshow filter 에서의 IMediaSample 의 시간에대한질문입니다 [1]
5052오명현8/26/20188373Tcp소켓 실습 Exeption 도와주세요! [4]파일 다운로드1
5049오명현8/23/20187735책 477페이지 내용 중 이해가 안가는 부분이 있어 질문드립니다. [1]
5048오명현8/23/20187412포트 관련 질문 하나더 있습니다. [1]
5047오명현8/22/20188087포트가 없을 경우를 가정한 내용에 대해 질문이 있습니다. 책468p. [1]
5046엿장수8/22/20187982다이렉트쇼 필터 추가하는데 [2]
5045임도진8/22/20188704c# opencv dll파일 로드 질문 [3]파일 다운로드1
5044엿장수8/20/20188396graphedit 에 등록되어있는 필터를 가져와서 사용하는방법을 알고싶습니다 [2]
... 31  [32]  33  34  35  36  37  38  39  40  41  42  43  44  45  ...