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

... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5358홍길동7/22/202014411개체에서 open 속성이나 매서드가 지원 되지 않읍니다.라고 오류창이 뜨는데. [1]
5357손동섭7/22/202015291책 예제코드... [3]
5355neska7/21/202014570안녕하세요 문의 드립니다 [1]
5354민성7/15/202017338안녕하세요 db연결 문자 보안 [2]
5353형성재7/14/202016013Visual Studio Setup Project에서 VC++2010재배포패키지설치 [4]
5352윤식7/10/202016724닷넷코어 빌드 시 runtimeconfig 파일을 없앨 수 있는지.. [4]
5351runr...7/2/202016408C# 에서 C++ dll 병렬 사용 [1]
5350홍성호6/29/202017761C++에서 정의된 구조체(공유메모리)를 C#으로 공유메모리에서 구조체 변환시 에러가 발생 합니다. [1]파일 다운로드1
5349jero...6/24/202014423logon credential provider 관련 문의드립니다. [1]
5348776/19/202014423시작하세요 C# 8.0프로그래밍 책에 대한 질문입니다. [8]
5347민성6/19/202014557안녕하세요 WPF Binding에서요 [1]
5346dimo...6/18/202015590Task.WhenAll() 메소드를 이용한 코드를 좀더 짧게 사용하고 싶은데 다른 표현이 있을까요? [3]
5345질문요6/12/202014206idc vs 집 속도 [2]
5344하태6/2/202015557c++ .ilb에서 c# dll 호출 질문 드리겠습니다 (콜백함수 전달) [4]
5343하태6/2/202019178안녕하십니까! c# dll을 c++ .lib에서 호출 질문 드립니다. [6]
5342진우5/30/202019691c++ 에서 C# DLL 사용 문의 [2]
5341미나리5/28/202015594스레드 lock키워드 관련 질문드립니다 [3]
5339민성5/27/202014630WPF cmd을 실행을 할때 파라미터 넘기는 방법 [1]
5338서영준5/26/202016176.Net Core Blazor 서버에 Xing API를 이용한 통신 요청 [5]파일 다운로드1
5337ogos...5/26/202016754C# DB connection string 보호 방법에 대하여 [2]
5336saki5/21/202016632이벤트 뷰어 .NET Runtime 오류 [3]
5335민성5/21/202014084안녕하세요 C#으로 컴퓨터 시작프로그램 목록을 가져와서 사용안함으로 바꿀려면 [1]
5334민성5/19/202015298안녕하세요 WPF 콘솔창을 띠우면서 Ping이라는 명령어가 콘솔에 Write되게 할려면 어떻게 해야 하나요?? [1]
5333초보5/18/202014623공유 메모리 관련 문의 [2]
5332질문요5/15/202014539TcpListener TcpClient 문의 [4]
5331sdd5/13/202014879안녕하세요 Settings관련하여 질문드립니다. [2]파일 다운로드1
... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...