Microsoft MVP성태의 닷넷 이야기
C# list.Clear() 호출에 대한 문의 드립니다. [링크 복사], [링크+제목 복사]
조회: 1941
글쓴 사람
김현진 (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 가 호출되지 않도록 하였습니다.

귀한 시간 할애 해주셨는데, 설명이 부족하여 정확한 답볍을 들을 수가 없었네요. 죄송합니다.
좀 더 자세한 설명과 첨부 자료를 준비하여 다시 문의를 드리도록 하겠습니다.
[손님]
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() 호출을 막았던 것이 정확한 방법이 아니라는 생각에 코드를 다시 작성하여 해결하였습니다.

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

1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5657C#...5/8/20221104초보 단순 질문 입니다.,ㅠ [1]
5656부탁...5/6/2022178932bit dll 을 64bit dll 화 [2]
5655감사...5/5/20221654UI 스레드 관련 질문드립니다. [4]파일 다운로드1
5653고석주5/3/20221282첨부된 이미지처럼 dll 을 어떻게 추가해야 하는지 문의드립니다. [1]파일 다운로드1
5652감사...5/2/20221187프로그램 종료되면 리소스(관리, 비관리)는 알아서 해제 되나요? [2]
5651윤식4/26/20221355상속 구조 관련 질문드립니다. [8]
5650김기헌4/19/20221260WPF 리소스 관련 질문드립니다 [3]
5649주니어4/15/20221177ffmpeg 질문 있습니다! [2]
5648주니...4/13/20221234컴파일된 코드를 원시코드로 바꾸려면 어떻게해야하나요? [1]파일 다운로드1
5647장성욱4/7/20221276코어지정 CPU사용률 관련 질문 [1]
5646서형주4/6/20221247List에 여러개의 class 객체를 만들어 넣을때, 객체의 method들도 같이 생성되어 메모리를 차지하나요? [1]
5645김인태4/6/20221165윈도우즈 서버의 AD 계정 생성 조건이 있을까요? [1]
5644ㅇㅇ4/6/20221315c# 프로그램을 이용하여 리눅스상에 파일 생성이 가능한가요? [1]
5643유필재4/5/20221301TCP클라이언트 연결 및 통신관련하여 문의드려요 [1]
5642차가워4/4/20221479UdpClient 패킷 수신 문의 [4]
5641장성욱4/4/20221520코어 할당 및 cpu 부하테스트 질문 [7]
5640ic...4/4/20221294웹가든에서 메모리 동적 업데이트 방법 [1]
5639차가워4/4/20221309c++ 서버 c# 클라이언트 호환 문의 [1]
5638초급4/3/20221573c# sql server 연동 [1]
5637따봉이4/1/20221689Winform Form Load 후 자동 캡쳐관련 [1]파일 다운로드1
5636김철순3/31/20221673WPF에서 Richtext의 View 문의 [5]
5635손님3/30/20221593안정적인 pinning이 가능하네요. [3]파일 다운로드1
5633꿀주...3/30/20221551선생님 마우스 클릭이벤트 질문이 있습니다. [4]
5632김현수3/30/20221535Remote Desktop으로 접속시 WPF UI 가 다시 그려지는 이벤트를 막을 수 없을까요? [3]
5631김기헌3/24/20221471WPF 컨트롤의 그래픽 처리관련 질문드립니다 [2]파일 다운로드1
5630장성욱3/24/20221405로깅관련 질문입니다. [2]
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...