枚举是引用类型还是值类型?
Posted
技术标签:
【中文标题】枚举是引用类型还是值类型?【英文标题】:Enum is Reference Type or Value Type? 【发布时间】:2013-01-11 18:00:32 【问题描述】:我在EntityFramework 5 类中使用了 Enum 属性, 但在数据库中,该字段可以为空。 Visual Studio 给出此属性必须是可为空的属性的错误。我的问题是:
【问题讨论】:
【参考方案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 变量,而不是改变它指向的对象。以上是关于枚举是引用类型还是值类型?的主要内容,如果未能解决你的问题,请参考以下文章
【PHP】值为1的string类型,转成int类型后值变成了0?