【问题标题】:Is this a safe way to access an enum?这是访问枚举的安全方法吗?
【发布时间】:2013-04-09 20:58:42
【问题描述】:

我的旧代码有这个:

if (chgList != ABCHeader.ChangeListTypes.Always)

这是 ABCHeader - 它是一个类(不是变量),并且是一个非静态类:

public class ABCHeader
{
    . . .

     public enum ChangeListTypes
     {
    ...
     }

chgList 是这样定义的:

private ABCHeader.ChangeListTypes chgList = ABCHeader.ChangeListTypes.Always;

这显然可以编译,但在我看来,这个非静态类 (ABCHeader) 以这种方式被引用并不正确。因为我在这段代码的某处有一个奇怪的空引用异常,所以我翻阅了我偶然发现的代码。这是一个潜在的问题,还是我肯定找错了树?

【问题讨论】:

  • 看起来不错,不过你应该把你的赋值放在构造函数中
  • @bash.d,为什么要在构造函数中赋值?
  • 只是一个约定,通常你只是这样分配 const 成员。
  • @bash.d,嗯,没有。使用C# field initializer syntax 初始化字段值是非常 标准。 (通常它甚至不需要一个构造函数)

标签: c# class static enums instantiation


【解决方案1】:

这只是嵌套类型class(静态和非静态)或struct 可以在其中包含另一种类型。句点. 是“静态成员”访问。这很像你调用静态方法的时期,比如ABCHeader.SomeMethod();

这种时间段永远不会像实例成员访问时间段那样导致NullReferenceException

请注意,.NET Framework 使用加号+ 而不是句点. 来表示嵌套类型。例如:

string typeString = typeof(ABCHeader.ChangeListTypes).ToString();
    // will contain a name including "ABCHeader+ChangeListTypes"

【讨论】:

    【解决方案2】:

    这并没有错。您可以通过类名访问类内部的嵌套枚举。

    现在,也就是说,我更喜欢将我的枚举放在顶层,而不是嵌套在类中,但如果你想这样做,那么它的语法就是合适的。

    【讨论】:

      【解决方案3】:

      以这种方式引用枚举完全没问题——你不能从中获得空引用异常。

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多