仅含基础字段的LoginViewModel、RegisterViewModel用struct还是class更合适?
关于Login/RegisterViewModel用struct还是class的问题
结论先行:对于仅包含string UserName和string Password的这类ViewModel,用struct不是良好实践,优先选择class更稳妥,具体原因如下:
引用类型字段的struct无轻量化优势
你的ViewModel里的字段都是string(引用类型),struct复制时只会拷贝引用地址(64位系统下每个引用占8字节,整个struct才16字节),和class的对象头+引用的内存开销相比,差距可以忽略不计,完全体现不出struct所谓的"轻量"价值。ViewModel的使用场景不匹配struct特性
ViewModel通常会在MVVM架构中被用于数据绑定、跨层传递,甚至可能需要修改属性值。struct是值类型,传递时默认会生成副本:- 如果在方法里修改副本的字段,原对象不会有任何变化,除非用
ref/out关键字传递,这会增加代码复杂度,还容易引发意想不到的bug; - 多数MVVM框架的绑定系统是为class设计的,struct作为值类型在属性变更通知(比如实现
INotifyPropertyChanged)时会有额外麻烦,修改属性需要重新赋值整个struct,不符合常规开发习惯。
- 如果在方法里修改副本的字段,原对象不会有任何变化,除非用
复制性能的顾虑完全没必要
这种小体积的struct复制操作,现代CPU处理起来极快,性能开销远低于业务逻辑、IO操作等环节的消耗。反而struct带来的代码维护成本、潜在bug风险,远比这点性能收益影响大。
RegisterViewModel的情况完全相同,同样不适合定义为struct。
总结:直接用class定义这类ViewModel才是符合MVVM常规实践的选择,既能避免不必要的坑,性能上也不会有任何问题。
内容的提问来源于stack exchange,提问作者amir.wpf
相关产品推荐
相关产品推荐

