我需要实现这个:
static class MyStaticClass
{
public const TimeSpan theTime = new TimeSpan(13, 0, 0);
public static bool IsTooLate(DateTime dt)
{
return dt.TimeOfDay >= theTime;
}
}
theTime
是一个常量(严重:-),就像π
一样,在我看来,从设置中读取它是毫无意义的。而且我希望它能够被初始化一次并且永远不会改变。
但是C#似乎不允许函数(构造函数是)初始化常量。如何克服这个?
答案 0 :(得分:59)
使用readonly
代替const
可以初始化,之后不会修改。这就是你要找的东西吗?
代码示例:
static class MyStaticClass
{
public static readonly TimeSpan theTime;
static MyStaticClass
{
theTime = new TimeSpan(13, 0, 0)
}
}
答案 1 :(得分:37)
常量必须是编译时常量,编译器无法在编译时评估构造函数。使用readonly
和static
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);
违反了常量字段的两个公理:
在问题中使用的是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.
}
}