2012-12-21 2 views
0

내 구조체 클래스 :구조체의 값을 어떻게 수정할 수 있습니까?

public struct PinAndRadius 
{ 
    public string pinID { get; set; } 
    public string radiusID { get; set; } 

    public string getPinID() 
    { 
     return pinID; 
    } 

    public string getRadiusID() 
    { 
     return radiusID; 
    } 
} 

문제와 방법

void mapArea_VE_PinDragged(double latitude, double longitude, object id) 
{ 
    foreach (var pin in pinRadiusCollection) 
    { 
     string ID = id.ToString(); 
     //string newID = ID.Substring(0, 18); 
     if (!pin.Key.pinID.Equals(ID)) 
     { 
      continue; 
     } 
     else if (pin.Key.pinID.Equals(ID)) 
     { 
      var newLoc = createNewSearchLocation(latitude, longitude); 
      mapArea.VE_DeleteRadius(pin.Key.radiusID); 
      drawPoly(newLoc, pin.Value.xar_Radius); 
      pin.Key.radiusID = pollyID; 
      break; 
     } 
    } 
} 

문제는 내가 pollyID에 pin.key.radiusID을 설정하려고하면, 내가

말하는 오류가 있다는 것입니다 변수가 아니기 때문에 'System.Collections.Generic.KeyValuePair.Key'의 반환 값을 수정할 수 없습니다.

아이디어가 있으십니까?

답변

0

단순히 구조체 정의를 클래스로 변경했습니다.

+0

구조와 수업의 차이점을 알고 있습니까? 클래스로 변경하면 코드가 컴파일되지만 구조체를 사용하는 경우의 의미와 다릅니다.어떤 상황에서는 구조체와 같은 의미 체계가 필요합니다 (이 경우에는 내가 제안한 접근 방식을 사용해야합니다). 반면 다른 것들은 클래스 의미 체계가 필요합니다. 'PinAndRadius' 타입의 변수가 콜렉션에 저장되고, 변수의'RadiusId'가 연속적으로 변경되면, 콜렉션에있는'RadiusId'도 역시 바꿀까요? 그렇게하면 변경 가능한 클래스가 적합합니다. 그렇지 않으면 ... – supercat

+0

... 변경 가능한 클래스는 잘못된 참조입니다 (인스턴스에 대한 하나의 참조를 통해 액세스 한 속성을 변경하면 해당 인스턴스에 대한 모든 참조에서 보이는 속성이 변경되므로). 비교적 적은 수의 예외를 제외하고, 각 변경 가능한 객체 인스턴스는 주어진 시간에 정확하게 하나의 소유자를 가져야하며 변경 가능한 객체에 대한 참조를 보유하는 모든 코드는 해당 객체를 소유하고 있는지 여부를 알아야합니다. 누가 소유하고 있는지 추적 할 수있는 공식적인 메커니즘은 없지만 무차별 객체 참조를 소유하고있는 사람을 알지 못하는 사이에이를 통과시키는 것은 버그의 처방입니다. – supercat

+0

이 경우, 콜렉션은 자주 변경 될 것입니다. 따라서 내가 변경 가능한 클래스를 사용했는지, 왜 C#에서 매우 새로운 것이 었는지, 그래서 당신이 제공 한 설명에 대해 매우 유용합니다. –

0

.net의 구조는 값 유형입니다. 이는 pin.Key을 사용하여 PinAndRadius을 참조 할 수 없음을 의미합니다. 종류가 PinAndRadiuspin.Key 사본을 받게됩니다. 그렇다면이 복사본과 컴파일러에 대한 액세스 권한이 없으므로 이에 대해 알려줍니다. C++ 용어에서는 l-value가 아닙니다.

struct을 만들면 항상 변경할 수 없도록 설정하십시오. 변경 가능한 구조는 악합니다.

이 문제를 해결하는 가장 간단한 방법은 PinAndRadiusclass으로 만드는 것입니다.

0

외모에 따르면 pinRadiusCollectionPinAndRadius으로 키 처리 된 일반적인 사전입니다. 오류는 사전에 키로 사용 중이므로 해당 개체를 수정할 수 없다는 것을 알리는 것입니다.

핀을 변경할 수 있다고 가정하면 핀을 저장하는 방법을 다시 검토해야합니다.

0

.net의 모음은 거기에 들어있는 구조체 유형 항목을 편리하게 수정할 수 있도록 설정되지 않았습니다. 그럼에도 불구하고 변경 가능한 구조체는 다른 유형의 데이터 유형보다 더 명확한 의미를 제공합니다. 모음에서 개최 구조체를 편집하려면 변수에 복사, 그 변수를 편집하고 다시 저장 : 그것은 가변 구조체는 속성으로 이상의 필드 등의 내용을 노출하도록 일반적으로 더 나은

var temp = myList[someIndex]; 
temp.SomeVield = whatEver; 
myList[someIndex] = temp; 

하는 것으로. 어떤 사람들은 변경 가능한 구조체가 그들의 의미가 클래스와 다르므로 악의가 있다고 말할 수 있습니다. 그러나 그것은 스크류 드라이버가 비열한 망치를 만들기 때문에 악의가 있다고 말하는 것과 같습니다. 노출 된 필드 구조체는 클래스 유형처럼 작동하지 않지만 모든 필드가 노출 된 구조체는 모두 서로 동일한 의미를가집니다. 이러한 의미는 클래스와 다르지만 유용 할 경우 평등을 갖지 않습니다.

덧붙여 말하자면 잘못된 대리인 "변경 가능한 구조체"의 상당 부분은 노출 된 필드 이외의 돌연변이 구조체 멤버 이 종종 읽기 전용 구조에 적용될 경우 가짜 코드를 생성한다는 사실의 결과였습니다. this의 필드를 수정하는 구조체 멤버가 필요하지 않으면 [정적 구조체 메서드가 ref 매개 변수로 수신 된 구조체의 필드를 수정하는 것이 안전합니다.] 이러한 위험은 적용되지 않습니다.

관련 문제