- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 C# 中,我想制作“智能”枚举,这在 Java 中是可能的,其中有更多信息附加到枚举值,而不仅仅是底层 int。我偶然发现了一个创建类(而不是枚举)的方案,如以下简单示例所示:
public sealed class C
{
public static readonly C C1 = new C(0, 1);
public static readonly C C2 = new C(2, 3);
private readonly int x;
private readonly int y;
private C(int x, int y)
{
this.x = x;
this.y = y;
}
public int X
{
get
{
return this.x;
}
}
public int Y
{
get
{
return this.y;
}
}
}
但是当我在上面运行 Visual Studio 的“代码分析器”时,它会给我警告 C2104,“不要声明只读可变引用类型”。
我明白为什么您通常不想声明只读可变引用类型,但是...我的类不是可变的,是吗?
阅读文档中的警告,似乎他们只是假设任何只读引用类型都是可变的。例如,它说如果类型确实是不可变的,那么可以随意抑制此警告。事实上,对于以下更简单的类,它给了我同样的警告:
public sealed class C
{
public static readonly C C1 = new C();
public static readonly C C2 = new C();
private C()
{
}
}
所以,好吧,除非我严重误解了可变性,否则 CA2104 不理解它。它的建议是让我抑制出现它的每一行的警告,只要我确定该类确实是不可变的。但是:
(1) 因此,除非我完全关闭此检查,否则我每次使用不可变只读成员时都必须取消它,我可能会对任何给定的枚举执行数百次?
(2) 但更糟糕的是,即使我这样做了,之后有人可能会不小心引入可变性,但其他人仍然会有一种虚假的安全感,因为有人手动将抑制放在那里说“我检查过并这是不可变的”?
最佳答案
您是对的 - 在这种情况下这是误报。您唯一的选择是单独抑制或关闭警告,缺点与您对每个选项的描述完全相同。
避免此警告的其他选项包括:
不要使用静态字段。相反,您可以使用具有公共(public)获取和私有(private)设置的静态属性,并在构造函数中初始化而不是内联。
创建这些不可变的值类型,这将绕过警告,但在某些情况下可能会产生不同的行为。根据您的情况,这可能是也可能不是一个选项。
关于C# 可变性 - VS 代码分析给我 CA2104?好像……可怜。我误会了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379245/
在 C# 中,我想制作“智能”枚举,这在 Java 中是可能的,其中有更多信息附加到枚举值,而不仅仅是底层 int。我偶然发现了一个创建类(而不是枚举)的方案,如以下简单示例所示: public se
我是一名优秀的程序员,十分优秀!