来自MSDN:
如果值类型的行为必须像 object,一个使值类型看起来像引用的包装器 对象在堆上分配,并复制值类型的值 进去。包装器已标记,因此系统知道它包含a 值类型。这个过程称为拳击,反向过程 被称为拆箱。拳击和拆箱允许处理任何类型 作为一个对象。
在我看来,值类型与引用类型完全不同,即使它们继承自引用类型(Object和ValueType)。我是对的吗?
答案 0 :(得分:0)
根据定义,是。
这就是规范所定义的方式!
C#具有统一的类型系统。所有C#类型,包括基本类型 例如int和double,从单个根对象类型继承。从而, 所有类型共享一组常用操作,任何类型的值都可以 以一致的方式储存,运输和操作。 此外,C#支持用户定义的引用类型和值 类型,允许动态分配对象以及内联 储存轻质结构。
它们的实施方式不同吗?是的,但它们仍然是System.Object
。
在规范中的任何地方,他们引用object
或System.Objects
,您可以确定它指的是所有类型。
您对以下代码的输出有什么期望?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StackOverflowConsole
{
public class EmptyClass
{
}
public class ReferenceStuff : EmptyClass
{
object a;
}
public class TypeStuff : EmptyClass
{
int a;
}
class Test
{
static void Main()
{
ReferenceStuff r = new ReferenceStuff();
TypeStuff t = new TypeStuff();
if (r is EmptyClass)
{
Console.WriteLine("r is an EmptyClass");
}
if (t is EmptyClass)
{
Console.WriteLine("t is an EmptyClass");
}
}
}
}
毫不奇怪,输出是:
r is an EmptyClass
t is an EmptyClass
为什么呢?因为它们都是EmptyClass
个对象。 EmptyClass
没有贡献任何object
没有的内容,但r和t都属于EmptyClass
类型。