【问题标题】:2 question regarding TYPE object. Does Type object is reference type? How can we create TYPE object if this is an abstract class?关于 TYPE 对象的 2 个问题。 Type 对象是引用类型吗?如果这是一个抽象类,我们如何创建 TYPE 对象?
【发布时间】:2018-11-06 08:51:48
【问题描述】:

Type 对象是引用类型吗?
假设我有这个代码:

String s = "AAA";
Type b = s.GetType();

b 是否指向位于堆上的类型对象?

我们如何为抽象类创建 TYPE 对象?
再次这段代码:

String s = "AAA";
Type b = s.GetType();

如果这是一个抽象类,s.GetType(); 如何创建一个 TYPE 对象? 不能创建抽象类的实例。

所以 Object.GetType() 方法,返回一个派生自 System.Type 的类型,即 System.RuntimeType - 这个我明白。但是哪个对象由 typeof(object) 返回?它应该是从 System.Type 派生的类型,因为类型类本身是抽象的。这种类型叫什么名字?

【问题讨论】:

  • 一种对象类型不是该对象类的实例。因此 abstract 修饰符不适用于查询类型,但类是抽象的事实最终将作为其类型的属性值(var abstracttype = typeof(abstract_class); 然后abstracttype.IsAbstract 将为真)。
  • System.Type 是一个类,所以是的,它是一个引用类型。
  • 你为什么想知道这个?你想解决什么问题?

标签: c# types gettype


【解决方案1】:

b 是否指向位于堆上的类型对象?

是的,因为 System.Type 是一个引用类型,所以它总是在堆上分配。

我们如何为抽象类创建 TYPE 对象?

var t = typeof(MyAbstractClass);

【讨论】:

    【解决方案2】:

    非虚拟方法Object.GetType() 由.NET 运行时实现。它返回调用它的对象的类型信息。

    返回的Type的实际实现是一个实现细节,但是.NET运行时会返回一个派生自System.Type的类型,即System.RuntimeType。另见What's the difference between System.Type and System.RuntimeType in C#?

    关于您的编辑:

    typeof(object)返回哪个对象?

    typeof(T) 被编译为Type.GetTypeFromHandle(),该方法返回的Type 派生类型又是一个实现细节。

    我只想知道如果类型对象是一个抽象类,怎么可能创建一个类型对象?

    你不能。 mscorlib 库包含public abstract class System.Typepublic abstract class System.TypeInfo 继承了 internal class RuntimeType。所以在内部,CLR 做了这样的事情:

    public Type GetType()
    {
        var typeInfo = new RuntimeType();
        // set some properties
        return typeInfo();
    }
    

    因为RuntimeType 继承自Type,所以可以从该方法返回该类型的实例。

    【讨论】:

    • 所以 Object.GetType() 方法,返回一个派生自 System.Type 的类型,即 System.RuntimeType - 这个我明白。但是哪个对象由 typeof(object) 返回?它应该是同样从 System.Type 派生的 s 类型,因为类型类是抽象的。这种类型叫什么名字?
    • 您好,谢谢您的回复。您能否再次解释一下:该方法返回的类型派生类型又是一个实现细节。
    • 一个实现细节的意思是:你必须处理文档中的说明;运行时如何准确地实现它可能会发生变化。所以就像我在你的问题下问的那样:你到底想知道什么,为什么?你将如何处理这些答案?
    • 我只想知道如果类型对象是抽象类,如何创建类型对象?所以我明白“gettype()”方法返回的类型是从抽象类派生的一个名为“运行时类型”(运行时类型)的派生类。我也想知道 typeof() 方法,在这种情况下,哪个类型类派生自类型抽象类?
    • 你不能。这就是运行时返回System.RuntimeType 的原因,它继承自System.Type。您可以使用抽象类型作为方法的返回类型。
    【解决方案3】:

    您可以在官方文档中轻松获取相关信息。请参考docs

    类型不指向实际对象。它只是获取有关对象类型的信息。

    由于您无法创建抽象类的实例,因此您将无法在该类上调用 GetType。

    【讨论】:

    • 这是一个很好的评论,但答案很差。
    • 不鼓励仅链接的答案。要么引用链接中最重要的部分信息,要么投票结束这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2012-12-28
    • 2021-01-09
    • 2010-09-30
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多