C#语言规范在第10.4节中清楚地说明了以下内容:
常量声明中指定的类型必须是sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。
同时,在第4.1.4节中它也阐述了以下内容:
通过const声明,可以声明简单类型(§10.4)的常量。不可能使用其他结构体类型来声明常量,但是可以通过static readonly字段实现类似的效果。
好的,所以使用static readonly可以获得类似的效果。看完后我试了以下代码:
static void Main()
{
OffsetPoints();
Console.Write("Hit a key to exit...");
Console.ReadKey();
}
static Point staticPoint = new Point(0, 0);
static readonly Point staticReadOnlyPoint = new Point(0, 0);
public static void OffsetPoints()
{
PrintOutPoints();
staticPoint.Offset(1, 1);
staticReadOnlyPoint.Offset(1, 1);
Console.WriteLine("Offsetting...");
Console.WriteLine();
PrintOutPoints();
}
static void PrintOutPoints()
{
Console.WriteLine("Static Point: X={0};Y={1}", staticPoint.X, staticPoint.Y);
Console.WriteLine("Static readonly Point: X={0};Y={1}", staticReadOnlyPoint.X, staticReadOnlyPoint.Y);
Console.WriteLine();
}
这段代码的输出结果是:
静态 Point: X=0;Y=0
静态 readonly Point: X=0;Y=0
偏移...
静态 Point: X=1;Y=1
静态 readonly Point: X=0;Y=0
按任意键继续...
我本来期望编译器会给我一些关于修改 静态只读 字段的警告,或者至少像对待引用类型一样修改字段。
我知道可变值类型很麻烦(微软为什么要把 Point
实现成可变的是个谜),但是难道编译器不应该以某种方式警告你正在尝试修改一个 静态只读 值类型吗?或至少警告你的 Offset()
方法不会产生“预期”的副作用吗?
Offset
调用的输出将是相同的。void Offset(int, int)
改变了值类型。 - InBetween