标准答案-有多少人能分得清值类型和引用类型?
引子:
TomiWong 园友发了一个帖子 有多少人能分得清值类型和引用类型?
问题:“class、object、string、int、bool、byte、interface、delegate、struct、enum,以上这些哪些是值类型,哪些是引用类型?”
回帖无数,但是我发现多数还是不明真相的群众。少数几个其实已经感觉到了真相,但是没有表达清楚。因此特此撰文,以正视听。
貌似正确的答案
如果要快速给一个一般性而言正确的答案,那么应该如下:
值类型: int, bool, byte, struct, enum
引用类型: class, object, string, interface, delegate
可是问题真那么简单么?难道很多回帖的兄弟都是胡闹?
核心问题
对问题里面的英文理解有歧义
题目应该试图问的,是用这些关键字定义并声明出来的变量分别是值类型还是引用类型
看看几个有代表性的意见:
============================
#4楼2010-12-03 17:14 | xiaotie
interface 和其它的不一样吧
============================
#14楼2010-12-03 17:26 | Ivony...
在这些东西里面:
object、string、int、bool、byte
是类型
class、interface、delegate、struct、enum
不是类型
只能说使用这些关键字定义的类型是引用类型还是值类型
============================
#18楼2010-12-03 17:30 | LeonSun
我就想问一个问题,class是什么类型?object是什么类型?
本来这个题对名词的定义就是模糊的,恐怕出这个题的人概念也是模糊的
别来误导群众了,真的~~~
============================
好了,意见还是不少的。让我们从头开始梳理问题出在哪里?
1、区分int类型和int类型变量
2、定义TomiWong问题中提到的int是指int型变量还是指int关键字?
3、然后我们才可以开始回答问题
我们平时说惯了,说int是值类型。教科书式的回答应该类似是:
int类型的变量是值类型变量
由此,我们推导出一个简化的说法
int类型是值类型
不少同学在interface、class、object几个关键字上一下子转不过弯来。的确,这几个东西平时不考虑的。我们只说对象类型的变量是引用类型变量,因此看到class的时候第一反应就是他不能算是对象,类不是对象这个是天条。呵呵
这里就出现一个双重标准的问题:
把问题中的所有东西看作他对应的变量,还是就是看做这个关键字,或者看做其代表的类型
class的中文翻译是类,请问类是什么类型?应该什么都不是
如果都看作是关键字,则这些东西也都什么类型都不是
只有当我们统一把他们都看作是变量,是用这些关键字定义并声明出来的变量的时候,才能心平气和地去回答问题
标准答案
C# 类型体系包含下列几种类别:
值类型、引用类型、指针类型
值类型的变量存储数据,而引用类型的变量存储对实际数据的引用。引用类型也称为对象。指针类型仅可用于 unsafe 模式(往极端上说,指针也是值类型)。
通过装箱和取消装箱,可以将值类型转换为引用类型,然后再转换回值类型。除了装箱值类型外,无法将引用类型转换为值类型。
值类型也可以为空(可空类型如:int?),这意味着它们能存储法非值状态。
值类型主要由两类组成:
结构、枚举
结构分为以下几类:
Numeric(数值)类型
整型、浮点型、decimal
整型包括:sbyte, byte, char, short, ushort, int, unit, long, ulong
浮点型包括:float, double
bool
用户定义的结构。
引用类型的变量又称为对象,可存储对实际数据的引用。
class、interface、delegate
内置引用类型:object、string
其实这答案都不是我写的
参考文献
我们都需要抽空看看 C#编程指南
出处:http://www.cnblogs.com/Chinese-xu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
如有问题,可以通过 Chinese_Xu@126.com 联系我,非常感谢。