结构和枚举是真的对象,还是只能转换为对象?

时间:2014-06-10 03:57:17

标签: c# .net

来自MSDN:

  

如果值类型的行为必须像   object,一个使值类型看起来像引用的包装器   对象在堆上分配,并复制值类型的值   进去。包装器已标记,因此系统知道它包含a   值类型。这个过程称为拳击,反向过程   被称为拆箱。拳击和拆箱允许处理任何类型   作为一个对象。

在我看来,值类型与引用类型完全不同,即使它们继承自引用类型(Object和ValueType)。我是对的吗?

1 个答案:

答案 0 :(得分:0)

根据定义,是。

这就是规范所定义的方式!

  

C#具有统一的类型系统。所有C#类型,包括基本类型   例如int和double,从单个根对象类型继承。从而,   所有类型共享一组常用操作,任何类型的值都可以   以一致的方式储存,运输和操作。   此外,C#支持用户定义的引用类型和值   类型,允许动态分配对象以及内联   储存轻质结构。

它们的实施方式不同吗?是的,但它们仍然是System.Object

在规范中的任何地方,他们引用objectSystem.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类型。