【问题标题】:Enum is Reference Type or Value Type?枚举是引用类型还是值类型?
【发布时间】:2013-01-11 18:00:32
【问题描述】:

我在EntityFramework 5 类中使用了 Enum 属性, 但在数据库中,该字段可以为空。 Visual Studio 给出此属性必须是可为空的属性的错误。我的问题是:枚举是引用类型还是值类型?

【问题讨论】:

    标签: .net enums value-type reference-type


    【解决方案1】:

    System.Enum 是引用类型,但任何特定枚举类型都是值类型。同理,System.ValueType 是引用类型,但从它继承的所有类型(System.Enum 除外)都是值类型。

    所以如果你有一个枚举 Foo 并且你想要一个可以为空的属性,你需要属性类型是 Foo?

    【讨论】:

    • 值得注意的是Foo?System.Nullable<Foo> 的糖,Nullable 也是一个值类型。
    【解决方案2】:

    如果你使用myEnum.SomeValue,它将是一个值类型。

    【讨论】:

      【解决方案3】:

      假设我们有枚举

      public enum eCategory
      {
          health ,        
          Weapon
      }
      

      以及一种 eCategory 类型,例如:-

      eCategory currentcategory;
      

      那么 currentcategory 是值类型

      【讨论】:

        【解决方案4】:
        public enum TestReferenceOrValue
        {
            one, two, three    
        }
        var a = TestReferenceOrValue.one;
        var b = a;
        b = TestReferenceOrValue.three;
        

        如果枚举是通过引用,更改b 会影响a
        Console.Write(a); → 一个
        Console.Write(b); → 三个

        一个很棒的 cSharp 在线工具 => http://csharppad.com/

        【讨论】:

        • 我对您显示的错误编程约定投了反对票。枚举字段应以大写字母开头。
        • 上面的代码示例没有帮助,因为它不管TestReferenceOrValue是引用类型还是值类型都是一样的。 var a = "a"; var b = a; b = "b"; Console.Write(a); Console.Write(b); 表明字符串(和每种类型)都以这种方式运行 - 而string 是一个引用类型。那是因为您覆盖 b 变量,而不是改变它指向的对象。
        猜你喜欢
        • 1970-01-01
        • 2010-12-04
        • 2013-07-14
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 2018-10-18
        相关资源
        最近更新 更多