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

... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
852임동찬1/6/201015396base.OnStart(agrs) [1]
851한귀순1/6/201020867oracle & transaction 질문 [5]
850박한주12/31/200917971COM과 C#간 권한 문제에 관해 여쭤봅니다. [5]
848날쌘돌이12/22/200918910C#으로 개발하는 ActiveX 디버깅 문제 [5]
847최승문12/16/200917748winform에서 웹서비스를 이용할때, 객체가 전송안되는 문제... [2]
846이강구12/14/200916708ATL COM 제작 문의 [3]
845김재영12/9/200919584ClickOnce에서 WinForm을 배포시 변동되는 Args값을 넘길 수 있나요? [3]파일 다운로드1
843김재영12/2/200917112Hyper-V 사용에 대해여 질문이 있습니다. [2]
842한귀순12/1/200919923Attempted to read or write protected memory [2]
841장근배11/30/200921540첨부 파일 Download시 한글 Name [2]
844장근배12/3/200916103    답변글 [답변]: 첨부 파일 Download시 한글 Name파일 다운로드1
840박영민11/20/200915864웹 애플리케이션 질문입니다. [1]
837left...10/21/200916753아래 게시글 관련하여 추가 질문 [3]
836left...10/19/200917802ActiveX 상에서 암시적 dll 로드 [1]
832김우진10/15/200914462C# 에서 swa + security 구현 방법이 없을까요?
833정성태10/15/200918525    답변글 [답변]: C#에서 swa + security 구현 방법이 없을까요? [1]
834김우진10/15/200914562        답변글 예제 메시지 올려드릴께요. [2]파일 다운로드1
838이영우10/30/200914499            답변글 국세청 전자세금계선서에 관하여 문의드립니다.
831채승수10/13/200916792스마트 클라이언트 GAC 등록 문제 여쭤봅니다... [2]
829박찬용10/9/200929279WebBrowser 컨트롤 사용시 새창을 띄울시 세션/쿠키 공유가 왜 안될까요?? [1]파일 다운로드1
827송창훈9/24/200914322[질문]CAS 설정
828정성태9/28/200917665    답변글 [답변]: [질문]CAS 설정 [1]
825김재영9/18/200915185프레임워크별 비트 지원에 대해서 문의를 드립니다. [2]
821채승수8/27/200914635클릭원스를 비스타에서 실행시 [1]
822채승수8/28/200919518    답변글 [답변]: 클릭원스를 비스타에서 실행시 [2]
818개발돌이8/14/200917179ActiveX개발한 dll을 임베디드 할때 UI에 대한 질문 [1]파일 다운로드1
... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...