- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在努力解决这个 FXCop 违规“DoNotDeclareReadOnlyMutableReferenceTypes”
MSDN:http://msdn.microsoft.com/en-us/library/ms182302%28VS.80%29.aspx
来自 MSDN 的代码会导致此违规:
namespace SecurityLibrary
{
public class MutableReferenceTypes
{
static protected readonly StringBuilder SomeStringBuilder;
static MutableReferenceTypes()
{
SomeStringBuilder = new StringBuilder();
}
}
}
来自乔恩的回答here和 here ,我知道保存对象引用的字段(在本例中为 SomeStringBuilder)是只读的,而不是对象本身(由 new StringBuilder()
创建)
那么以这个例子为例,一旦字段引用了对象,我将如何更改对象本身?我喜欢Eric Lippert's example了解如何更改只读数组,并希望看到任何其他可变引用类型的类似内容
最佳答案
readonly意味着您无法在构建后更改引用。
FXCop 的官方立场是,它建议只将不能修改的类型声明为 readonly
。因此像 string
这样的东西是可以的,因为对象的值不能改变。但是 StringBuilder
的值可以更改,但将其设置为只读只会阻止您在构造函数运行后将字段分配给不同的 StringBuilder
实例或 null
.
我不同意 FXCop 对这条规则的看法。只要理解这只是一种强制执行,即引用不得在构建后更改,那么就不会有混淆。
请注意,readonly
关键字使值类型不可变,但引用类型不是。
namespace SecurityLibrary
{
public class MutableReferenceTypes
{
static protected readonly StringBuilder SomeStringBuilder;
static MutableReferenceTypes()
{
// allowed
SomeStringBuilder = new StringBuilder();
}
void Foo()
{
// not allowed
SomeStringBuilder = new StringBuilder();
}
void Bar()
{
// allowed but FXCop doesn't like this
SomeStringBuilder.AppendLine("Bar");
}
}
}
关于c# - 不可变的只读引用类型和 FXCop 违规 : Do not declare read only mutable reference types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2274412/
我是一名优秀的程序员,十分优秀!