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