结构体和枚举是真正的对象,还是它们只是可转换为对象
本文关键字:对象 可转换 结构体 枚举 | 更新日期: 2023-09-27 18:07:45
来自MSDN:
在需要值类型的行为类似于对象,它是使值类型看起来像引用的包装器对象在堆上分配,并复制值类型的值进去。包装器被标记,以便系统知道它包含值类型。这个过程被称为装箱,反之亦然被称为开箱。装箱和拆箱允许处理任何类型作为一个对象。
在我看来,值类型的处理与引用类型完全不同,即使它们继承了引用类型(Object和ValueType)。我说的对吗?
根据定义,是。
规范就是这样定义的!
c#有一个统一的类型系统。所有c#类型,包括基本类型例如int和double,继承自单个根对象类型。因此,所有类型共享一组公共操作,任何类型的值都可以以一致的方式储存、运输和操作。此外,c#同时支持用户定义的引用类型和值类型,允许对象的动态分配以及内联轻质结构的存储。
它们的实现是否不同?是的,但它们仍然是System.Object
。
规范中任何提及object
s或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
类型的