社区
C#
帖子详情
Enum是值类型还是引用?
hwyqy
2006-08-11 06:08:10
不容置疑,枚举当然是值类型。不过,MSDN上有这样一句话:类 Enum 是从类 ValueType 派生而来的,即 Enum 本身是引用类型,而不是值类型。是何意思?还请高手指点一下。
...全文
2289
46
打赏
收藏
Enum是值类型还是引用?
不容置疑,枚举当然是值类型。不过,MSDN上有这样一句话:类 Enum 是从类 ValueType 派生而来的,即 Enum 本身是引用类型,而不是值类型。是何意思?还请高手指点一下。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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#中所有的类型其实都是引用类型的,值类型通过装箱也能变得和引用类型一样的一些性质……记得以前看书的就因为初箱折箱折腾半天。。。
菜鸟发言,高手看了不要笑偶
以专业开发人员为伍
2006-08-14
打赏
举报
回复
没有仔细研究msdn。也许,msdn是描述的.net早期版本的东西,现在已经应该改写了。
以专业开发人员为伍
2006-08-14
打赏
举报
回复
正如 ?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
打赏
举报
回复
有没有什么方法测试一个类型是值类型还是引用类型?
大数据专家傅一航
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; }
}
}
以专业开发人员为伍
2006-08-12
打赏
举报
回复
注意 IsClass、IsGenericType、IsInterface、IsEnum、IsSerializable、IsValueType 等。
以专业开发人员为伍
2006-08-12
打赏
举报
回复
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"}
以专业开发人员为伍
2006-08-12
打赏
举报
回复
其实 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)
枚举
类型
(
enum
)
enum
是
引用
类型
,java
引用
类型
的数据要用equals比较,但是
enum
可以用==,因为
enum
中的每一个常量在 jvm中只有唯一的实例(天然的单例) meun底层就是final class Xxx extends
Enum
{ … },不能被继承,不能new,...
c#基础 01.1 枚举
enum
(
值
类型
)
转载至:http://blog.csdn.net/mss359681091/article/details/51074440一、在学习枚举之前,首先来听听枚举的优点。 1、枚举能够使代码更加...二、枚举说明 1、简单枚举枚举使用
enum
关键字来声明,与类同级。枚举...
C#中的
引用
类型
和
值
类型
一,c#中的
值
类型
和
引用
类型
众所周知在c#中有两种基本
类型
,它们分别是
值
类型
和...根据定义所知,所有的
值
类型
都必须从System.ValueType派生,所有的枚举都从System.
Enum
抽象类派生,而后者又从System.ValueType派生
C#详解
值
类型
和
引用
类型
区别
首先,什么是
值
类型
,什么是
引用
类型
? 在C#中
值
类型
的变量直接存储数据,而
引用
类型
的变量持有的是数据的
引用
,数据存储在数据堆中。
值
类型
(value type):byte,short,int,long,float,double,decimal,...
C#枚举(
enum
)
枚举(
enum
)是什么? 1.枚举
类型
声明为一组相关的符号常数定义了一个
类型
名称。枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定。...枚举
类型
是使用
enum
...
C#
110,539
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章