c# - 非平凡数据类型的预定义常量

标签 c# constants readonly mutable

我的目标:为具有 ID 和消息的预定义错误创建一个 C# 类。 这是我尝试过的:

public class MyError
{
    public static readonly MyError OK = new MyError(0, "OK");
    public static readonly MyError Bad = new MyError(1, "Bad Stuff");

    public MyError(int id, string message)
    {
        this.Id = id;
        this.Message = message;
    }

    public readonly int Id;
    public readonly string Message;
}

这编译得很好,我相信它在实践中会很好地工作。但我总是喜欢遵循代码分析指南。在上述情况下,违反了 CA2104“不要声明只读可变引用类型”

除上述之外,我还尝试了很多其他方法,包括尝试使用 const 而不是 readonly(甚至无法编译),{ get;私有(private)集; } 对于成员访问,结构而不是类等。

哪个是可变类型? ID 还是消息?

我愿意接受任何可以实现我想要的建议:非平凡数据类型的预定义常量。

当然,我总是可以忽略警告,但我发现它们通常是有原因的。

* 澄清 * 我的问题实际上不是关于这个特定的 MyError 类,而是关于为基本数据类型以外的东西定义常量的更基本的问题。

假设我想定义三个 double 常量。 C# 让我这样做:

   public const double HighValue = 11.0;
   public const double LowValue = 0.1;
   public const double MidValue = 5.5;

C# 为我们预定义的 double 创建了一些有用的常量:NaNMinValueMaxValue, NegativeInfinity, PositiveInfinity.

那么现在,如果想为空间中的三维向量 (X,Y,Z) 预定义一些有趣的常量怎么办?我可以为 double 、整数、字符串等定义常量,但是如何为不那么琐碎的东西定义常量呢? Origin 是一个有趣的常量,我想给它起个名字:

public class Vector3D
{
    /// The problem is that this does not work
    public const Vector3D Origin = { 0.0, 0.0, 0.0 };

    public double X;
    public double Y;
    public double Z;
}

我不需要成千上万的常量。就像我们的 friend doubleNaN 一样。这个类也不需要特别保护或密封。任何人都可以自由地创建 Vector3D 对象并以他们想要的任何方式从中派生。我只想有一个名为 Origin 的特殊常量,其值为 (0.0, 0.0, 0.0)

最佳答案

你的类型不是可变的,但代码分析不知道。
此警告是误报;你应该压制它。


回答您编辑的问题:

const 只能应用于原语。
对于自定义类型,static readonly 是唯一的选择。

只要类型适本地不可变,它就会完美地工作。

关于c# - 非平凡数据类型的预定义常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15621305/

相关文章:

c# - 如何通过 sudo 运行命令并通过 ssh .net c# 输入密码

c# - 实现具有通用约束的接口(interface)

c++ - 在c++中声明变量常量有什么意义

javascript - 使整个网页链接不可点击的最佳方法是什么

c# - 如何展平 IEnumerables 的 IEnumerables 的串联

c# - C# 标签的子文本

c# - MySQL ODBC-IM002

c++ - 将 const char** 与模板特化结合使用

ruby-on-rails - 验证模型字段 : if value equals a key in a hash

c# - C# 中的不可变和只读是什么意思?