2012-09-19 5 views
4

컬렉션에 저장해야하는 구조체가 있습니다. 구조체에는 사전을 반환하는 속성이 있습니다.다른 컬렉션 내에서 구조체 컬렉션 속성에 액세스하기

내가 항목을 컬렉션에 추가 한 다음 사전에 액세스하려고 시도하면 구조 값 속성이 업데이트되지 않는다는 것을 발견했습니다.

var collection = new ItemCollection { new Item() }; // pre-loaded with an item 
collection[0].Values.Add("myKey", "myValue"); 
Trace.WriteLine(collection[0].Values["myKey"]); // KeyNotFoundException here 

그러나 나는 첫 번째 항목을로드하는 경우 다음 값 필드가 유지되는 컬렉션에 추가합니다.

var collection = new ItemCollection(); 
var item = new Item(); 
item.Values.Add("myKey", "myValue"); 
collection.Add(item); 
Trace.WriteLine(collection[0].Values["myKey"]); // ok 

는 이미 구조체가이 유형에 대한 잘못된 선택이라고 결정했습니다, 그리고 클래스를 사용할 때 문제가 발생하지 않습니다,하지만 난 두 가지 방법 사이의 차이점에 대해 궁금합니다. 아무도 무슨 일이 일어 났는지 설명 할 수 있니?

+1

msdn doc : 다음은 msdn 예제입니다. http://msdn.microsoft.com/en-us/library/vstudio/8b0bdca4.aspx – Cybermaxs

답변

1

이전에 언급 한 바와 같이 struct Itemclass Item으로 변경하십시오. struct을 사용하면 표현 collection[0]new ItemCollection { new Item() }에 생성 된 객체에 대한 참조를 반환하지 않고 그 사본을 생성하여 사용자에게 제공합니다.

+0

show on this show? –

2
대신 클래스로 당신의 구조체를 변경

: 나는 내장에 익숙한 아니에요 이제

public class Item {} 

하지만 구조체는 값 형식이고 클래스는 참조 형식이고, 나는 믿고있다 첫 번째 코드 예제를 실행할 때 예외가 발생하는 이유를 설명하는 논리입니다.

나는 누군가가 당신에게 좀 더 철저한 답을주기를 희망하지만, 지금은 구조체를 클래스로 변경하십시오.

+0

여기서 볼 수 있듯이 http://stackoverflow.com/questions/521298/when-to-use-struct-in-c),이 구조에 대한 구조체를 갖는 것이 이상적이지 않다고 생각합니다. – Cybermaxs

1

"항목"은 값 항목입니다. 즉, 컬렉션에 액세스하면 복사본이 만들어집니다. 모든 작업은 해당 복사본 여기에 복사, 다음 값이 접근을 얻을 만든 첫 번째 항목의

collection[0].Values.Add("myKey", "myValue"); 

에 복사본에 저장되고, 다음 항목이 추가되어 새로운 인스턴스를 생성 할 수 있습니다. 그 사본은 파괴된다.

해결 방법은 당신이 컬렉션에 액세스하는 경우 값이 구조체

public struct Item 
{ 
    private IDictionary<string, string> values = new Dictionary<string, string>(); 
    public IDictionary<string, string> Values 
    { 
     get 
     { 
      return this.values; 
     } 
    } 
} 

의 작성에 직접 사전을 만드는 것, 사본이 이루어진다. 이 사본에는 원래 값과 같은 값 사전에 대한 참조가 들어 있습니다. 그래서 원래의 사전은 수정되었습니다

+0

감사합니다. 컴파일러가 값 필드에 할당을 허용하지 않는 복사본에 대해서는 정확합니다. "구조체에 인스턴스 필드 이니셜 라이저를 사용할 수 없습니다." – paddyb

+0

구조체에 생성자가있을 수 있습니다. –

+0

@Baboon true이지만 여전히 값 필드에 할당 할 수 없습니다. – paddyb

관련 문제