我今天遇到一个使用结构的问题让我措手不及,我希望有人可以为我揭开它.
我有一个像这样定义的结构:
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"); } } }
如果我将Payment属性更改为这样的公共字段,我可以做到这一点很奇怪:
public class Transaction { public PaymentDetail Payment; }
很明显我不了解导致这种结构的结构.这是一个坏主意吗?有没有更好的办法?我究竟做错了什么?
首先 - 没有可变结构(即可以在构造之后通过setter等更改值的结构).这是造成混淆的主要原因.
重点是; 当你调用一个属性(比如Payment
)时,你得到一个值的副本(在你的本地堆栈区域).对于一个类,这是一个引用的副本(没问题).对于结构体,它是结构本身的副本.对该值的任何更改都将被丢弃,因此编译器已阻止您丢失数据.
当它是一个公共领域时,你正在直接改变原始值,这就是它不介意的原因.但改变结构确实不是一个好主意.
使PaymentDetail
一类; 这是正确的解决方案......
在.NET中,结构体不是"没有行为的对象" - 它们是"价值类型".诸如"货币/价值对","时间范围"等等可能会产生有效的结构 - 但不是PaymentDetail
.