标准答案-有多少人能分得清值类型和引用类型?
引子:
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 联系我,非常感谢。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述