0

我有一些“常量”的初始化属性/字段,我想知道以下哪一行最适合使用:

  1. public static Color MyColor { get { return Color.Red; } }
  2. public static readonly Color MyOtherColor = Color.Red;

(惰性)初始化后是否存在一些运行时差异?性能用途是否不同?

4

3 回答 3

3

如果它们是常量,则使用常量:

public const Color MyColor = Color.Red;

为了回答这个问题,这里是 msdn 论坛上的一个很好的阅读:内存消耗:静态字段与静态属性

编辑

正如乔在评论中指出的那样,Color不能将其声明为常量,因为它不是编译时常量。

乔回答了这个问题的更好答案。

最后,使用静态只读字段与属性之间不会有明显的区别。使用最适合情况的任何东西。

于 2012-06-05T14:34:29.757 回答
1

字段使用指南建议对预定义的对象实例使用公共静态只读字段。例如:

public struct Color
{
    // this is a predefined immutable instance of the containing Type
    public static readonly Color Red = new Color(0x0000FF);

    ...
}

在你的情况下,我可能会使用一个属性:

public class MyClass
{
    // Not a predefined instance of the containing Type => property
    // It's constant today, but who knows, tomorrow its value may come from a 
    // configuration file.
    public static Color MyColor { get { return Color.Red; } }
}

更新

当我看到您的答案时,这很清楚,但是在 System.Drawing 中使用 ILSpy 向我显示了以下代码: public static Color Red { get { return new Color(KnownColor.Red); } }

上面链接的指南(以 Color 为例)适用于 .NET 1.1,并且可能已经演变。就个人而言,我认为使用属性不会出错。 .NET 4.0 Field Guidelines类似,但使用DateTime.MaxValueDateTime.MinValue作为预定义对象实例的示例。

于 2012-06-05T14:50:05.837 回答
0

一些实际的考虑:

  • 如果您打算在 switch 语句或表达式中使用该值,则它必须是 const,而不是只读字段或属性。
  • 如果您打算使用其他程序集的值,您可能希望使用只读字段而不是常量。如果您在程序集 A 中有一个常量并在程序集 B 中使用该常量,则该常量值将编译到程序集 B 中。如果您随后更改该常量并仅重新编译程序集 A,则程序集 B 仍将包含原始值,并且必须是重新编译。这不是只读字段的情况,因为该值将在运行时从程序集 A 中检索。
于 2021-10-18T20:20:35.250 回答