如何在C#中创建公共const大小?

时间:2011-02-22 13:00:36

标签: c# .net const readonly

我正在尝试编写以下代码:

public const Size ImageSize = new Size() { Width = 28, Height = 28 };

但是我收到WidthHeight是只读的错误。

建议的方法是什么?

7 个答案:

答案 0 :(得分:10)

根本问题是您无法将System.Drawing.Size类型的对象声明为const。这表明该符号将在编译时被替换为常量的值。

相反,您应该使用readonly。这也是一个“常量”值,因为一旦构造函数运行就无法修改它,但是这些对象是在运行时而不是编译时创建的。

以下代码编译得很好:

public static readonly Size ImageSize = new Size() { Width = 28, Height = 28 };

答案 1 :(得分:8)

const仅限于编译器可以直接写为IL的原语。 readonly应该足够如果 Size被视为不可变的,即

public static readonly Size ImageSize = new Size(28,28);

请注意,如果Size是可变struct,则可能会发生错误;我建议使用属性而不是字段来防止一些令人困惑的副作用。

答案 2 :(得分:2)

public static readonly Size ImageSize = new Size(28,28);

答案 3 :(得分:1)

你必须这样做:

public readonly Size ImageSize = new Size(28, 28);

使实例只读以防止它被更改,因为您无法将Size创建为常量。

来自文档:

  

常量表达式是一个可以在编译时完全计算的表达式。因此,引用类型常量的唯一可能值是string和null。

答案 4 :(得分:1)

您正在编写的代码:

public const Size ImageSize = new Size() { Width = 28, Height = 28 };

实际上编译如下:

public const Size ImageSize = new Size();
ImageSize.Width = 28;
ImageSize.Height = 28;

您使用的版本,称为对象初始化程序,只是上述后一版本的语法简写。这两者在逻辑上是相同的。在后一个版本中,您可以看到它为什么会给您错误,您无法在声明后在const设置属性。

更重要的是,我不确定你是否甚至可以像const一样使用这样的引用类型。我不确定,因为我不能说我曾经尝试过。您可以尝试使用readonly。虽然您可能遇到相同或类似的问题。

Size是否有可以使用参数调用的构造函数,而不是使用对象初始值设定项?

答案 5 :(得分:0)

您需要使用以width和height为参数的构造函数。 此外,表达式必须在编译期间完全可评估。这可能不适用于您的Size类型(不知道它是哪一种)。如果是这样(与System.Drawing.Size一样),您可以考虑使用readonly代替const

答案 6 :(得分:0)

您可以使用:

public static readonly Size ImageSize = new Size(28, 28);

它实际上不是const,但在初始化后不会改变。