结构体和枚举是真正的对象,还是它们只是可转换为对象

本文关键字:对象 可转换 结构体 枚举 | 更新日期: 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类型的