gpt4 book ai didi

c# - 不可变的只读引用类型和 FXCop 违规 : Do not declare read only mutable reference types

转载 作者:太空狗 更新时间:2023-10-29 20:15:19 26 4
gpt4 key购买 nike

我一直在努力解决这个 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();
}
}
}

来自乔恩的回答herehere ,我知道保存对象引用的字段(在本例中为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com