【问题标题】:when is "load an assembly" necessary何时需要“加载程序集”
【发布时间】:2021-04-23 12:58:49
【问题描述】:

我正在读一本书,上面写着:

获取 TypeInfo 对象会强制 CLR 通过确保程序集 定义类型被加载。这可能是一项昂贵的操作,如果您需要,可以避免 是类型引用(类型对象)。但是,有了 TypeInfo 对象后,您可以查询许多 类型的属性以了解更多信息。大多数属性,例如 IsPublic、IsSealed、 IsAbstract、IsClass、IsValueType 等表示与类型关联的标志。

以下是部分源代码:

public abstract class Type : ... {
   public bool IsPublic { get; }
   public bool IsSealed { get; }
   public bool IsAbstract { get; }
   ...
}

public static class IntrospectionExtensions {
   public static TypeInfo GetTypeInfo(this Type type);
}

public abstract class TypeInfo : Type {
   ...
}

我的问题是:

作者的意思好像是你需要在一个Type对象中调用GetTypeInfo方法导致CLR先加载程序集,然后你可以查询IsPublic、IsSealed、IsAbstract、IsClass、IsValueType。所以看来你不能在调用GetTypeInfo 方法之前查询这些属性。但是我对程序集元表的理解是,一个被引用类型的基本信息,例如类型是否是一个类,抽象等都存储在引用程序集的元表中,所以当引用程序集中的代码想要查询一个基本信息时在外部程序集中的类型,CLR 只需要读取引用程序集中的元表,即当前正在执行的程序集,CLR 不需要加载/读取外部(引用)程序集,我的理解是否正确?

【问题讨论】:

  • 我认为你误解了作者,他们只是说你可以使用TypeInfo 一旦你有一个,你显然可以使用Type 对象(它是抽象的)这是也不是TypeInfo
  • @Charlieface 所以当代码(引用程序集)获取在外部程序集中定义的类的类型,并且代码在类型对象上调用 IsPublic 时,是否会加载外部程序集?

标签: c# .net


【解决方案1】:

TypeInfo 是反射的一部分。 Reflection 中的所有操作往往都是一项昂贵的操作。

TypeInfo 用于后期绑定——这意味着您的代码不知道它正在使用什么类型。 IE,您正在使用泛型或插件。

如果您不进行后期绑定(IE,您的代码确切地知道您正在使用什么“类型”,那么您不需要执行任何类似于 TypeInfo 的操作。

编辑:我还没有读过这篇文章,但是这篇关于为什么反射慢的文章(或者可能是一些谷歌研究)可以帮助你理解你的问题:https://mattwarren.org/2016/12/14/Why-is-Reflection-slow/

【讨论】:

猜你喜欢
  • 2013-10-02
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多