例如在F#中我们可以定义
type MyRecord = {
X: int;
Y: int;
Z: int
}
let myRecord1 = { X = 1; Y = 2; Z = 3; }
Run Code Online (Sandbox Code Playgroud)
并且我可以做更新
let myRecord2 = { myRecord1 with Y = 100; Z = 2 }
Run Code Online (Sandbox Code Playgroud)
这很棒,而且记录自动实现IStructuralEquality而不需要额外的努力这一事实让我希望在C#中实现这一点.但是,也许我可以在F#中定义我的记录,但仍然可以在C#中执行一些更新.我想像一个API
MyRecord myRecord2 = myRecord
.CopyAndUpdate(p=>p.Y, 10)
.CopyAndUpdate(p=>p.Z, 2)
Run Code Online (Sandbox Code Playgroud)
有没有办法,我不介意脏黑客,如上所述实施CopyAndUpdate?CopyAndUpdate的C#签名将是
T CopyAndUpdate<T,P>
( this T
, Expression<Func<T,P>> selector
, P value
)
Run Code Online (Sandbox Code Playgroud) 我有一个开始生活可变的课程,但我已经让它变得一成不变.我应该改成它struct吗?选择一个而不是另一个需要考虑哪些因素?我的特殊情况是一个Point类型类(它代表一个自定义坐标系中的坐标),由4个int字段组成,加上一些属性以不同的方式访问相同的数据.我注意到这String是一个类并且是不可变的,因此必须有一些用例.