当前位置: 首页 > 编程语言 > C#

C#CA2104-自动代码分析不喜欢静态只读可变类型分享

时间:2023-04-10 11:41:57 C#

C#CA2104-自动代码分析不喜欢静态只读可变类型{//将用于派生类//让我们假设foo是线程安全的protectedstaticreadonlyFooStaticFoo=newFoo();}VisualStudio2008的代码分析弹出以下消息:CA2104:Microsoft.Security:从“Base.StaticFoo”中删除只读名称或将字段更改为不可变引用类型。如果引用类型“Foo”实际上是不可变的,则排除此消息。我的设计是否存在固有缺陷,或者我可以在源代码中添加[SuppressMessage]吗?问题在于它给人一种错误的印象——它让值看起来无法更改,而实际上它只是字段值无法更改,而不是对象。我认为这里的代码分析过于谨慎——在很多地方,您可能希望将可变类型存储在只读字段中,尤其是当它是私有的、在静态初始化程序中初始化并且永远不会在代码中发生变化时。虽然此字段受到保护,但派生类滥用它的风险更大。我个人认为我所有的领域都是私人的。另一方面,我不知道你的代码——可能是你权衡了各种可能性并决定这是正确的做法。如果Foo确实是线程安全的,那么除了该字段是只读的事实给人的不变性的一般印象之外,没有什么可担心的。我将禁用该行的警告并添加注释以强调该对象是可变的,即使该字段是只读的。Foo类型是不可变的吗?如果不是,您是否打算只使用这个Foo对象,但能够更改其属性?如果是这种情况,警告只是说readonly关键字具有误导性。没有编译错误——对象的引用是只读的,这是你向编译器声明的。但是,您向其他开发人员声明的是StaticFoo是只读的,这意味着它永远不会改变。所以,你可以选择,就像它说的那样。要消除此警告,请删除readonly关键字,或添加SuppressMessage属性。或者,查看代码的设计。将Foo实现为单例会更合适吗?该警告告诉您readonly修饰符仅适用于引用本身。如果Foo是引用类型,您仍然可以修改Foo实例的状态,除非您确保Foo是不可变的。在另一个节点上,在对代码进行单元测试时,此类静态可能会导致各种问题,因此如果这对您很重要,您可能需要查看其他方法来实现您正在尝试做的事情。以上是C#学习教程:C#CA2104-自动代码分析不喜欢静态只读变量类型共享的所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: