为何在const字段上使用NonSerializedAttribute特性?
为什么要在const字段上使用
NonSerializedAttribute? 先来看下引发疑问的代码片段:
[NonSerialized] const string PreFix = "System.Security.ClaimsIdentity."; [NonSerialized] const string ActorKey = PreFix + "actor";
这个问题确实挺耐人寻味的——毕竟const字段本身是编译期常量,根本不会参与对象的序列化过程,那为啥还要多此一举加上NonSerializedAttribute呢?我梳理了几个可能的原因:
- 代码风格与一致性要求:很多团队会制定统一的编码规范,要求所有不需要被序列化的字段(不管是什么类型)都统一标记
NonSerializedAttribute。这样做可以避免开发人员去区分“哪些字段本来就不会序列化”,保持代码风格的一致性,也能防止遗漏标记那些真正需要的字段。 - 消除工具警告:部分静态代码分析工具或者序列化相关的框架工具,可能会扫描类中的所有字段,如果发现没有标记
NonSerializedAttribute的字段,就会抛出“该字段未明确标记是否序列化”的警告。为了消除这些无意义的警告,开发人员就给const字段也加上了这个特性。 - 防范未来的代码变更风险:假设后续有人维护代码时,把const字段改成了readonly或者普通实例字段(这种情况在迭代中并不少见),如果之前没加
NonSerializedAttribute,这个字段就会被意外序列化,可能引发潜在的bug。提前加上这个特性,就算字段类型变更,也不用再特意调整序列化标记,降低了后续维护的风险。 - 增强代码可读性:这个特性相当于给其他开发人员一个明确的文档提示:“这个字段不需要被序列化”。哪怕读者知道const字段的序列化规则,看到这个标记也能立刻明白该字段的序列化行为,不用额外思考,提升了代码的可读性和可维护性。
内容的提问来源于stack exchange,提问作者UserControl
相关产品推荐
相关产品推荐

