值类型和基本类型有什么区别?

16

在阅读一本关于C#的书时,我注意到有时会提到某些数据类型(例如int、double)的值类型和原始类型。我以为它们是同一件事,但它们真的相同吗?

值类型和原始类型有什么区别?它们是同一件事吗?

编辑

这个问题不仅与C#编程语言有关,我想知道它们在任何其他语言中的区别。


7
例如,一个结构体是值类型但不是原始类型。 - L.B
参见:https://dev59.com/g2oy5IYBdhLWcg3wEKBn - user1249569
类型的正式分类为:值类型和引用类型。原始或本地类型是指基本类型,如int、char、bool等等...它们通常是值类型。 - Jaider
1
@DJKRAZE 看一下修改,这个问题不仅仅与C#和.NET有关... - user1678517
3
问题是,不同语言的答案略有不同,因此任何正确的答案要么非常冗长,要么过于笼统而没有什么用处。 - James Gaunt
2
这个问题不仅仅与C#编程语言有关,因此您可以假设每种语言都会以相同的方式处理它们。 - L.B
3个回答

8

原始类型(例如 int )可以直接映射到基类库(BCL)类型(例如 System.Int32 )

值类型从 System.ValueType 继承,并按值传递(除其他属性外)。

它们与 object ( System.Object )不可互换,因为 object 是原始类型,但不是值类型,而结构是值类型但不是原始类型。

在此处查看更多区别


2
答案仅涵盖C#和.NET,其他语言是否相同?请查看问题的标签... - aleroot
1
好的,有很多种编程语言,所以我怀疑它们并不都相同。我回答了C#的定义,因为问题中提到了它。 - D Stanley

6

值类型通常是存储在堆栈上的任何类型。

原始类型是在编程语言级别定义的类型,通常甚至是一个值类型,并直接由语言的编译器支持。

然而,这只是一个概括性的答案,因为每种编程语言在这两种类型之间都有不同的差异集...


5
除了Eric Lippert称这个栈的观点为“神话”,他应该知道:http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx - James Gaunt
2
@JamesGaunt 是的,对于C#可能是正确的,但对于Java或ANSI C呢?你确定我的答案是错误的吗? - aleroot
1
“值类型通常是存储在堆栈上的任何类型。” 的翻译是:值类型通常指存储在堆栈上的任何类型。 - Vikas Verma
我还是不明白 :( - BenKoshy
无论是哪种语言,值类型是分配在堆栈上还是其他地方都是实现细节。Eric Lippert的文章同样适用于Java。此外,这个答案并没有真正解释差异,并且声明值类型不被编译器直接支持可能会非常误导。 - Raimund Krämer
显示剩余2条评论

-1

1
问题是关于值类型和基元类型之间的区别,而不是值类型和引用类型。 - James Gaunt
1
需要解释的不是值类型和引用类型之间的区别,再读一遍问题... - aleroot
2
他正在咨询有关值 vs. 基本类型,而不是值 vs. 引用的问题。 - Mark Hall
1
-1,请阅读问题... - iMortalitySX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接