如何在C#中将类实例声明为常量?

Iva*_*van 37 .net c# const

我需要实现这个:

static class MyStaticClass
{
    public const TimeSpan theTime = new TimeSpan(13, 0, 0);
    public static bool IsTooLate(DateTime dt)
    {
        return dt.TimeOfDay >= theTime;
    }
}
Run Code Online (Sandbox Code Playgroud)

theTime是一个常数(严重:-),就像?在我的情况下,从设置中读取它是没有意义的,例如.而且我希望它能够被初始化一次并且永远不会改变.

但是C#似乎不允许函数(构造函数)初始化常量.怎么克服这个?

ash*_*vey 60

在此之后使用readonly而不是const可以初始化而不是修改.这就是你要找的东西吗?

代码示例:

static class MyStaticClass
{
    public static readonly TimeSpan theTime;
    static MyStaticClass
    {
        theTime = new TimeSpan(13, 0, 0)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Downvoters:请解释为什么你在解决OP问题的答案.如果它不是一个好的解决方案,至少可以解释原因. (7认同)
  • readonly static不适用于开关盒和默认参数。我们仍然需要const。 (6认同)
  • 我在我自己的代码中使用它,但我的肛门保持性人格知道每次我这样做时,在我的应用程序的内存中有一个很长的生命对象.我有一个长期运行的应用程序已经使用了太多的内存,它只是困扰我.我希望有一个TimeSpan文字可以编译到我的代码中.另一种方法是使用const int,将我的TimeSpan值转换为miliseconds ...但是数学. (4认同)
  • @ashelvey我在寻找像OP这样的恒定方法时找到了这个页面。就我而言,只读不起作用,静态也不起作用。我想在类属性的属性内使用它 - 这意味着我需要一个常量。(我没有对你投反对票,因为这不太可能,但这是你得到一些的可能原因之一。) (2认同)

Jam*_*unt 37

常量必须是编译时常量,编译器无法在编译时评估构造函数.使用readonlystatic构造函数.

static class MyStaticClass
{
  static MyStaticClass()
  {
     theTime = new TimeSpan(13, 0, 0);
  }

  public static readonly TimeSpan theTime;
  public static bool IsTooLate(DateTime dt)
  {
    return dt.TimeOfDay >= theTime;
  }
}
Run Code Online (Sandbox Code Playgroud)

一般来说,我更喜欢在构造函数中初始化而不是直接赋值,因为您可以控制初始化的顺序.

  • 使用ctor进行成员初始化的最大好处是,您可以在引发它们的上下文中捕获和处理异常. (8认同)
  • @pickypg - 对不起我的错误 - 修复了.@Ivan - 我对此发表评论.我个人不喜欢直接初始化,因为你需要搜索一个类来找出初始化的地方.始终在构造函数中初始化是一致的,您可以轻松地查看类的初始状态.您还可以直接控制初始化的顺序.在一个简单的静态类案例中,可能没有太大区别.但良好的做法是良好的做法 - 特别是在边缘情况下. (6认同)
  • 为什么是构造函数?只是将一个成员描述为公共静态只读TimeSpan theTime = new TimeSpan(13,0,0)似乎工作(至少没有编译错误). (5认同)

Eti*_*tel 10

C#的const含义与C++的含义不同const.在C#中,const用于基本上为文字定义别名(因此只能用文字初始化).readonly更接近你想要的,但请记住它只影响赋值运算符(除非它的类具有不可变的语义,否则该对象不是真正的常量).

  • 值得一提的是,`static readonly`字段**可以通过反射来改变,而`const`**不能**. (4认同)

Joh*_*hey 7

这个链接:

常量必须是值类型(sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool),枚举,字符串文字或null引用.

如果要创建对象,则必须执行以下操作static readonly:

static class MyStaticClass
{
  public static readonly TimeSpan theTime = new TimeSpan(13, 0, 0);
  public static bool IsTooLate(DateTime dt)
  {
    return dt.TimeOfDay >= theTime;
  }
}
Run Code Online (Sandbox Code Playgroud)


lan*_*nce 5

public static readonly TimeSpan theTime = new TimeSpan(13, 0, 0);
Run Code Online (Sandbox Code Playgroud)