Enum是值类型还是引用?

hwyqy 2006-08-11 06:08:10
不容置疑,枚举当然是值类型。不过,MSDN上有这样一句话:类 Enum 是从类 ValueType 派生而来的,即 Enum 本身是引用类型,而不是值类型。是何意思?还请高手指点一下。
...全文
2289 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCjian 2006-12-27
  • 打赏
  • 举报
回复
(:
llyzcy 2006-12-27
  • 打赏
  • 举报
回复
mark
colaxu 2006-12-27
  • 打赏
  • 举报
回复
mark
gaozhongfa 2006-12-27
  • 打赏
  • 举报
回复
学习
zxkid 2006-12-27
  • 打赏
  • 举报
回复
不好意思
ValueType是类,IsValueType = false
zxkid 2006-12-27
  • 打赏
  • 举报
回复
typeof(System.Enum).IsValueType == false

System.Enum也不是一个值类型,说明它是引用类型,跟它是不是类没关系

System.Enum作用是为枚举提供基类,而为枚举提供基类的作用是提供比较此类的实例的方法、将实例的值转换为其字符串表示形式的方法、将数字的字符串表示形式转换为此类的实例的方法和创建指定枚举和值的实例的方法。

ValueType的定义是:
public abstract class ValueType
ValueType是不是类呢?也不是
pyuan 2006-08-14
  • 打赏
  • 举报
回复
在C#里,所有的类型,不管值类型还是引用类型,都是从System.Object派生出来,System.Object不是一个引用类型么……针对这些比较特殊的东东,在C#里当然有独特的规范。比如说值类型,如果所有的类型全变成引用类型,肯定是非常影响效率的,所以才有了System.ValueType类,以及从此派生出来的各种值类型。就像楼上说的,枚举类型也是一种独特的东东,你把他当成一个独特的类型来对待就OK了,不要想太多了
其实,个人感觉吧。C#中所有的类型其实都是引用类型的,值类型通过装箱也能变得和引用类型一样的一些性质……记得以前看书的就因为初箱折箱折腾半天。。。
菜鸟发言,高手看了不要笑偶
  • 打赏
  • 举报
回复
没有仔细研究msdn。也许,msdn是描述的.net早期版本的东西,现在已经应该改写了。
  • 打赏
  • 举报
回复
正如 ?typeof(aaa) 所输出的,枚举类型继承自 System.Enum,但是枚举本身不是类,不是范型,不是接口。枚举类型是独特的。

而 打印 ?typeof(System.Enum) 的结果:

?typeof(System.Enum)
{Name = "Enum" FullName = "System.Enum"}
[System.RuntimeType]: {Name = "Enum" FullName = "System.Enum"}
base {System.Reflection.MemberInfo}: {Name = "Enum" FullName = "System.Enum"}
Assembly: {mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
AssemblyQualifiedName: "System.Enum, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
Attributes: Public | Abstract | Serializable | BeforeFieldInit
BaseType: {Name = "ValueType" FullName = "System.ValueType"}
ContainsGenericParameters: false
DeclaringMethod: “(typeof(System.Enum)).DeclaringMethod”引发了“System.InvalidOperationException”类型的异常
DeclaringType: null
FullName: "System.Enum"
GenericParameterAttributes: “(typeof(System.Enum)).GenericParameterAttributes”引发了“System.InvalidOperationException”类型的异常
GenericParameterPosition: “(typeof(System.Enum)).GenericParameterPosition”引发了“System.InvalidOperationException”类型的异常
GUID: {c43345b9-7fed-3fc7-8fc2-7b1b82bc109e}
HasElementType: false
IsAbstract: true
IsAnsiClass: true
IsArray: false
IsAutoClass: false
IsAutoLayout: true
IsByRef: false
IsClass: false
IsCOMObject: false
IsContextful: false
IsEnum: false
IsExplicitLayout: false
IsGenericParameter: false
IsGenericType: false
IsGenericTypeDefinition: false
IsImport: false
IsInterface: false
IsLayoutSequential: false
IsMarshalByRef: false
IsNested: false
IsNestedAssembly: false
IsNestedFamANDAssem: false
IsNestedFamily: false
IsNestedFamORAssem: false
IsNestedPrivate: false
IsNestedPublic: false
IsNotPublic: false
IsPointer: false
IsPrimitive: false
IsPublic: true
IsSealed: false
IsSerializable: true
IsSpecialName: false
IsUnicodeClass: false
IsValueType: false
IsVisible: true
MemberType: TypeInfo
Module: {CommonLanguageRuntimeLibrary}
Namespace: "System"
ReflectedType: null
StructLayoutAttribute: {System.Runtime.InteropServices.StructLayoutAttribute}
TypeHandle: {System.RuntimeTypeHandle}
TypeInitializer: {Void .cctor()}
UnderlyingSystemType: {Name = "Enum" FullName = "System.Enum"}

对照 IsEnum、IsValueType 可以看出 enum 的独特性。
starhand 2006-08-12
  • 打赏
  • 举报
回复
mark
kingtoo008 2006-08-12
  • 打赏
  • 举报
回复
路过...
------------------------------------------------------------------------------------
100M.Net空间+50M企业邮局=60元/年
100M.Net空间+国际顶级域名=100元/年
国际顶级域名.com.net.cn=50元/年
本站申请域名可绑定免费10M Asp.Net空间
1000M.Net空间 + 100M MsSql数据库 + 1000M企业邮局 + 顶级域名=600元/年
数据库 企业邮局 网站推广 整机租用 美国空间 网站建设 均有售
还有很多优惠套餐提供给各个用户层.
有意者可联系电话:021-64802212 传真:021-64802212
咨询信箱:info@kingtoo.com 咨询OICQ:68311305,379620139 81778640

hwyqy 2006-08-12
  • 打赏
  • 举报
回复
fsxdxh(假行僧) :不容置疑,enum 定义的枚举型是值类型,但我们讨论的System.Enum到底是值类型还是引用类型。MSDN上有说明了所有的枚举继承于System.Enum,而System.Enum继承于ValueType,但又说System.Enum是引用类型,所以才有此疑问。
Ivony 2006-08-12
  • 打赏
  • 举报
回复
可以肯定的是,CLR的继承模型是依赖于引用类型的,就像C++的依赖于指针一样,所以如果是值类型是绝对没有可能继承的,一旦转换为接口和基类类型,值类型都是装箱转换为引用类型来完成的。
Ivony 2006-08-12
  • 打赏
  • 举报
回复
有没有什么方法测试一个类型是值类型还是引用类型?


这个已经牵涉到值类型引用类型的定义,不先明确定义的话,是不能判断的。
Knight94 2006-08-12
  • 打赏
  • 举报
回复
to 有没有什么方法测试一个类型是值类型还是引用类型?

use "Object.ReferenceEquals" method

ref:
http://blog.csdn.net/Knight94/archive/2006/08/11/1050901.aspx
hwyqy 2006-08-12
  • 打赏
  • 举报
回复
有没有什么方法测试一个类型是值类型还是引用类型?
  • 打赏
  • 举报
回复
=========================
我们总是喜欢在那里空谈理论。就是不会有人去验证一下。

很简单,如果是引用类型,作为参数传入到函数,并在函数内部修改,
1)如果在函数外,此类型的值改变了,就是引用类型
2)如果在函数外,此类型的值未改变了,就是值类型。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

void ModifyDay(TimeDay day)
{
if (day != TimeDay.Evening)
{
day = TimeDay.Evening;
}
else
{
day = TimeDay.Morning;
}
}

void ModifyDay2(TimeDay2 day)
{
if (day.ThisDay != TimeDay.Evening)
{
day.ThisDay = TimeDay.Evening;
}
else
{
day.ThisDay = TimeDay.Morning;
}
}

private void button1_Click(object sender, EventArgs e)
{
TimeDay day = TimeDay.Afternoon;

ModifyDay(day);

Console.WriteLine(day); //输出Afternoon

TimeDay2 day2 = new TimeDay2(TimeDay.Morning);
ModifyDay2(day2);

Console.WriteLine(day2.ThisDay); //输出Evening
}
}

public enum TimeDay
{
Morning = 0,
Afternoon = 1,
Evening = 2
}

public class TimeDay2
{
private TimeDay day;

public TimeDay2(TimeDay day)
{
this.day = day;
}

public TimeDay ThisDay
{
get { return day; }
set { day = value; }
}
}
  • 打赏
  • 举报
回复
注意 IsClass、IsGenericType、IsInterface、IsEnum、IsSerializable、IsValueType 等。
  • 打赏
  • 举报
回复
sorry,可惜c#的编译器现在不能自动处理数组对Array的转换。上边的代码修改为:

Array.ForEach(Enum.Names(typeof(enumtype)),delegate(string x){console.WriteLine(x);});

即可。

Enum仅仅是一个普通类型,里边定义了一些方法,而已。而enum是编译器可以认识的关键字,它可以自动把enumtype这个类型编译成一种独特的定义。下面是我打印 enum aaa{...} 的调试结果;

?typeof(aaa)
{Name = "aaa" FullName = "WindowsApplication1.Form1+aaa"}
[System.RuntimeType]: {Name = "aaa" FullName = "WindowsApplication1.Form1+aaa"}
base {System.Reflection.MemberInfo}: {Name = "aaa" FullName = "WindowsApplication1.Form1+aaa"}
Assembly: {WindowsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
AssemblyQualifiedName: "WindowsApplication1.Form1+aaa, WindowsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
Attributes: Public | NestedPublic | Sealed
BaseType: {Name = "Enum" FullName = "System.Enum"}
ContainsGenericParameters: false
DeclaringMethod: “(typeof(aaa)).DeclaringMethod”引发了“System.InvalidOperationException”类型的异常
DeclaringType: {Name = "Form1" FullName = "WindowsApplication1.Form1"}
FullName: "WindowsApplication1.Form1+aaa"
GenericParameterAttributes: “(typeof(aaa)).GenericParameterAttributes”引发了“System.InvalidOperationException”类型的异常
GenericParameterPosition: “(typeof(aaa)).GenericParameterPosition”引发了“System.InvalidOperationException”类型的异常
GUID: {0e329814-129c-3ef9-a6e7-d280111fb912}
HasElementType: false
IsAbstract: false
IsAnsiClass: true
IsArray: false
IsAutoClass: false
IsAutoLayout: true
IsByRef: false
IsClass: false
IsCOMObject: false
IsContextful: false
IsEnum: true
IsExplicitLayout: false
IsGenericParameter: false
IsGenericType: false
IsGenericTypeDefinition: false
IsImport: false
IsInterface: false
IsLayoutSequential: false
IsMarshalByRef: false
IsNested: true
IsNestedAssembly: false
IsNestedFamANDAssem: false
IsNestedFamily: false
IsNestedFamORAssem: false
IsNestedPrivate: true
IsNestedPublic: false
IsNotPublic: false
IsPointer: false
IsPrimitive: false
IsPublic: false
IsSealed: true
IsSerializable: true
IsSpecialName: false
IsUnicodeClass: false
IsValueType: true
IsVisible: false
MemberType: NestedType
Module: {WindowsApplication1.exe}
Namespace: "WindowsApplication1"
ReflectedType: {Name = "Form1" FullName = "WindowsApplication1.Form1"}
StructLayoutAttribute: {System.Runtime.InteropServices.StructLayoutAttribute}
TypeHandle: {System.RuntimeTypeHandle}
TypeInitializer: null
UnderlyingSystemType: {Name = "aaa" FullName = "WindowsApplication1.Form1+aaa"}
  • 打赏
  • 举报
回复
其实 enum 和 System.Enum 没有任何直接关系。这可以通过 System.Enum.GetNames(Type enumType) 看出来。

Enum 就是一个普通的自定义类型,它把enum作为对象进行一些操作。同时因为enum是特殊值类型,只能使用不能实例化,因此其实Enum通常是把 typeof(enum类) 作为参数的。

例如:

Enum.Names(typeof(enumtype)).ForEach(delegate(string x){console.WriteLine(x);});

用于打印enumtype中的所有内容。
加载更多回复(26)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧