我今天遇到一个使用结构的问题让我措手不及,我希望有人可以为我揭开它.
我有一个像这样定义的结构:
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.
| 归档时间: | 
 | 
| 查看次数: | 4374 次 | 
| 最近记录: |