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

时间:2011-06-03 18:39:14

标签: c# .net const

我需要实现这个:

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

theTime是一个常量(严重:-),就像π一样,在我看来,从设置中读取它是毫无意义的。而且我希望它能够被初始化一次并且永远不会改变。

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

7 个答案:

答案 0 :(得分:59)

使用readonly代替const可以初始化,之后不会修改。这就是你要找的东西吗?

代码示例:

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

答案 1 :(得分:37)

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

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;
  }
}

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

答案 2 :(得分:10)

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

答案 3 :(得分:7)

来自this link

  

常量必须是值类型(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;
  }
}

答案 4 :(得分:4)

public static readonly TimeSpan theTime = new TimeSpan(13, 0, 0);

答案 5 :(得分:1)

Constant表示静态成员,其值永远不会更改。这意味着在编译时定义了一个常量值。
声明:

    public const TimeSpan theTime = new TimeSpan(13, 0, 0);

违反了常量字段的两个公理:

  • 只有C#内置类型(不包括System.Object)可以声明为const。
  • 必须在编译时评估Iniatialization值

在问题中使用的是TimeSpan类型,它不是内置(预定义)类型。这意味着csc.exe编译器无法识别它。
如果使用内置C#类型(例如String)并且想要使用编译时值初始化常量成员,则仍会出现错误: 例如

 public const string MyNumber = SetMyString();
 private string SetMyString()
 {
  return "test";
 }

解决问题,您可以声明成员:

static readonly

修饰符,如果要在运行时仅声明一次字段:

public static readonly string MyNumber = SetMyString();
private static string SetMyString()
{
 return "test";
}

答案 6 :(得分:0)

您可以使用readonly关键字:

  

当字段声明包含只读修饰符时,赋值为   声明引入的字段只能作为其中的一部分出现   声明或在同一类的构造函数中。

示例(从链接的MSDN页面复制):

class Age
{
    readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}