여러 개체 추가 시 목록 덮어쓰기 이해
목록에 여러 개체를 추가하면 예기치 않은 동작이 발생할 수 있습니다. 모든 목록 항목은 마지막으로 추가된 개체와 동일한 값으로 끝날 수 있습니다. 이는 단일 객체 인스턴스에 대한 공유 참조로 인해 발생합니다.
예를 살펴보겠습니다.
<code class="language-csharp">public class Tag { public string TagName { get; set; } } List<Tag> tags = new List<Tag>(); Tag tag = new Tag(); // This is the problem! string[] tagList = new[] { "Foo", "Bar" }; foreach (string t in tagList) { tag.TagName = t; tags.Add(tag); }</code>
코드는 루프 외부에 하나의 Tag
객체(tag
)를 생성합니다. 그런 다음 루프는 이 동일한 개체를 반복적으로 수정하고 목록에 추가합니다. 결과적으로 모든 목록 항목은 최종 TagName
할당
해결책: 루프 내에서 새 인스턴스 생성
이 문제를 수정하려면 각 반복마다 루프 Tag
내부에 새 객체를 생성하세요.
<code class="language-csharp">foreach (string t in tagList) { Tag tag = new Tag(); // Create a new instance each time tag.TagName = t; tags.Add(tag); }</code>
이렇게 하면 각 목록 항목이 고유한 Tag
이 있는 고유한 TagName
개체를 참조하게 됩니다.
대안: 구조체 사용
C#의 클래스는 참조 유형입니다. 반면에 구조체는 값 유형입니다. 구조체를 사용하면 목록에 추가될 때 구조체의 복사본이 생성되므로 덮어쓰기 문제를 피할 수 있습니다.
<code class="language-csharp">public struct Tag { public string TagName { get; set; } } List<Tag> tags = new List<Tag>(); foreach (string t in tagList) { Tag tag = new Tag { TagName = t }; //Creates a new instance each time tags.Add(tag); }</code>
이 접근 방식은 구조체의 고유한 할당 시 복사 동작을 활용하여 간결하고 효율적인 솔루션을 제공합니다. 그러나 구조체는 나타내는 데이터에 적합한 경우에만 신중하게 사용해야 합니다.
위 내용은 목록에 여러 개체를 추가하면 이전 항목을 덮어쓰는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!