> 백엔드 개발 > C++ > 목록에 여러 개체를 추가하면 이전 항목을 덮어쓰는 이유는 무엇입니까?

목록에 여러 개체를 추가하면 이전 항목을 덮어쓰는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-19 20:18:17
원래의
237명이 탐색했습니다.

Why Does Adding Multiple Objects to a List Overwrite Previous Entries?

여러 개체 추가 시 목록 덮어쓰기 이해

목록에 여러 개체를 추가하면 예기치 않은 동작이 발생할 수 있습니다. 모든 목록 항목은 마지막으로 추가된 개체와 동일한 값으로 끝날 수 있습니다. 이는 단일 객체 인스턴스에 대한 공유 참조로 인해 발생합니다.

예를 살펴보겠습니다.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿