-
list나 ControlCollection등 remove 시 유의 할 점프로그램(C# etc.) 2023. 3. 6. 12:57
for문 사용보다는 while문을 사용해서 삭제하는게 좋다. for문 중간에서 Remove를 하면, 리스트의 요소 하나가 삭제되기 때문에 뒤쪽에 요소를 신뢰 할 수 없다.
예시1>
// Loop through all child forms in the parent form's Controls collection while (this.Controls.OfType<UnitFindImage>().Any()) { // Find the first child form in the Controls collection UnitFindImage childForm = this.Controls.OfType<UnitFindImage>().First(); // Remove the child form from the parent form's Controls collection this.Controls.Remove(childForm); // Dispose the child form to release its resources childForm.Dispose(); }
예시2>
while (LogMessages.Any()) { try { string message = LogMessages.First(); File.AppendAllText(Path.Combine(System.IO.Directory.GetCurrentDirectory(), strCurDate), message); LogMessages.Remove(message); } catch (Exception ex) { // If the append fails again, log the error message to the console. Console.WriteLine($"Failed to append log message: {ex.Message}"); } }
- 범위를 벗어난 인덱스: 목록 또는 ControlCollection에서 항목을 제거할 때, 인덱스가 컬렉션 범위 내에 있는지 확인하십시오. 범위를 벗어난 인덱스가 있는 항목을 제거하려고 하면 IndexOutOfRangeException이 발생합니다.
- 동시 수정: foreach 루프로 반복하는 동안 목록 또는 ControlCollection을 수정하지 마십시오. . 대신 for 루프를 사용하여 컬렉션을 반복하고 필요에 따라 항목을 제거합니다. 반복하는 동안 컬렉션을 수정하면 예기치 않은 동작이 발생할 수 있습니다.
- 이벤트 핸들러: ControlCollection에 이벤트 핸들러가 연결된 컨트롤이 포함된 경우 이벤트 핸들러를 제거하기 전에 해당 핸들러를 제거해야 합니다. 컬렉션에서 제어합니다. 그렇게 하지 않으면 메모리 누수 및 예기치 않은 동작이 발생할 수 있습니다.
- 개체 폐기: ControlCollection의 컨트롤이 IDisposable을 구현하는 경우, 개체에서 제거하기 전에 적절하게 폐기해야 합니다. 컬렉션. 이렇게 하면 컨트롤에서 사용하는 관리되지 않는 리소스가 해제됩니다.
- 컬렉션 유형: 제거하려는 컬렉션 유형에 따라 제거할 수 있는 특정 메서드 또는 속성이 있을 수 있습니다. 항목을 효율적으로. 예를 들어 List에는 RemoveAt 및 RemoveRange 메서드가 있고 ControlCollection에는 Remove 및 Clear 메서드가 있습니다.
- 성능: 컬렉션에서 항목을 제거하는 데 시간이 걸릴 수 있습니다. -특히 대규모 컬렉션의 경우 소모적인 작업입니다. 컬렉션에서 항목을 자주 제거해야 하는 경우 HashSet 또는 Dictionary와 같은 데이터 구조를 사용하는 것이 좋습니다. 이러한 데이터 구조는 목록이나 배열보다 항목을 제거하는 데 더 나은 성능을 제공합니다.
'프로그램(C# etc.)' 카테고리의 다른 글