如何在C#中创建一个公共的常量大小?

5

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

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

但是我收到了“宽度”和“高度”是只读的错误。

有什么推荐的方法来解决这个问题吗?

7个回答

12

const 关键字仅适用于编译器可以直接编写为中间语言的原始数据类型。如果 Size 被视为不可变量,那么使用 readonly 关键字就足够了。

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

请注意,如果 Size 是一个可变的 struct,那么可能会发生不好的事情;我建议使用属性而不是字段来防止许多令人困惑的副作用。

但是 System.Drawing.Size 是一个可变结构体 - https://dev59.com/OGYq5IYBdhLWcg3wzDlI - Flash
@Andrew 在这种情况下,readonly 关键字会处理这个问题(你不能更改被标记为 readonlystruct 中的字段;编译器不允许你这样做)。至于 Size 是否是可变结构体:这取决于我们正在谈论哪个 Size:OP 没有引用命名空间,并且在 BCL 中有 多个 Size 类型,或者你当然可以定义自己的。 - Marc Gravell

10

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

相反,你应该使用readonly。从某种意义上讲,这也是一个“常量”值,因为一旦构造函数运行,就不能修改对象,但是对象是在运行时创建而不是在编译时创建的。

以下代码可以正常编译:

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

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

一行代码没有解释,很可能是从以前的答案复制过来的,肯定会被踩。 - BrunoLM
2
对不起,先生!我先发布了我的答案,当我看到其他有完整解释的答案出现时,我就继续了我的生活。请您也这样做。 - Jesper Larsen-Ledet

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是否有一个你可以使用参数调用的构造函数,而不是使用对象初始化程序呢?


@BrunoLM:是的,Size确实有一个以宽度和高度为参数的构造函数。这仍然无法解决您的根本问题,但了解这一点仍然很值得。 - Cody Gray

1
你必须这样做:
public readonly Size ImageSize = new Size(28, 28);

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

来自文档:

常量表达式是一种可以在编译时完全评估的表达式。因此,引用类型的常量的唯一可能值是字符串和null。


0

你需要使用一个以宽度和高度为参数的构造函数。此外,表达式必须在编译时完全可计算。这可能无法与你的Size类型(不知道是哪个)一起使用。如果是这样(例如System.Drawing.Size),你可以考虑使用readonly而不是const


0

你可以使用:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接