2009-03-25 5 views
2

오늘 날 구조대를 사용하여 문제가 발생하여 누군가 나를 위해 빛을 비출 수 있기를 바랍니다.표현식 값이므로 과제의 대상이 될 수 없습니다.

I는 다음과 같이 정의 된 구조체가 있습니다

public struct PaymentDetail 
{ 
    public Decimal Amount{get;set;} 
    public string CheckNumber{get;set;} 
    public PaymentType PaymentType{get;set;} 
} 

을 내가 가지고있는 내가 같은 기본 속성을 설정하려는

public class Transaction 
{ 
    public PaymentDetail Payment{get;} 
} 

내가 프리젠 테이션 모델이이 정보를 포함하는 클래스 이

public class ViewModel 
{ 
    public Decimal Amount 
    { 
     get{return _Transaction.PaymentDetail.Amount;} 
     set 
     { 
      //This is the offending line of code 
      _Transaction.PaymentDetail.Amount = value; 
      RaisePropertyChanged("Amount"); 
     } 
    } 
} 

결제 정보를 변경하면 내가 할 수있는 것은 무엇입니까?

public class Transaction 
{ 
    public PaymentDetail Payment; 
} 

거기에 obviosuly 뭔가 내가 이것을 일으키는 structs에 대해 이해가 안 돼요. 이것은 나쁜 생각입니까? 더 좋은 방법이 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

6

먼저 변경 가능한 구조체 (예 : 건설 후에 값을 변경할 수있는 구조체, 세터 등)가 없습니다. 그것이 혼란의 주요 원인입니다.

요점은; 속성 (예 : Payment)을 호출하면 사본 (로컬 스택 영역에 있음)이 표시됩니다. 클래스의 경우 참조 사본입니다 (문제 없음). 구조체의 경우 구조체 자체의 복사본입니다. 해당 값의 변경 사항은 버려 지므로 컴파일러가 데이터 손실을 막을 수 있습니다.

공개 필드 인 경우 원래 값을 직접 변경하고 있으므로 걱정하지 않으셔도됩니다. 그러나 돌연변이 구조체는 실제로 좋은 생각이 아닙니다.

PaymentDetail을 클래스로 지정하십시오. 그게 정확한 해결책입니다 ...

.NET에서 구조체는 "동작없는 객체"가 아닙니다. "값 유형"입니다. "통화/값 쌍", "시간 범위"등과 같은 항목은 유효한 구조체를 만들 수 있지만 PaymentDetail이 아닐 수 있습니다.

+0

그래서 때마다 내가 구조체의 다른 값을 쓸어 버릴 것입니다 값 중 하나를 변경? – Micah

+1

아니요 ... 당신이 생각하는'PaymentDetail'을 편집하지 않을 수도 있습니다 - 당신이 깜박일 때마다 스스로 복제 할 것입니다! –

-3

결제가 읽기 전용으로 설정자가 아니기 때문에 발생했을 수 있습니다. 구조체는 값 형식이기 때문에 구조체가 읽기 전용 인 경우 구조체에 대한 속성을 설정할 수 없습니다.

세터를 추가하면 문제가 해결됩니다.

또한 PaymentDetail을 클래스로 변경하는 것도 고려해 보겠습니다. 아주 기본적인 값일 때만 구조체를 사용합니다. 특히 문자열이 하나 인 경우이 세 가지 속성이있는 것이 클래스 여야합니다.

+0

세터를 추가해도 문제가 해결되지 않습니다. –

관련 문제