在log4net configuration manual的第一个示例中,作者使用typeof(MyApp)
来获取包含类MyApp
的类型。是否有理由不使用this.GetType()
,性能方面?因为在我看来,this.GetType()
在复制到另一个类时可能会因潜在的复制粘贴错误而更加安全。
答案 0 :(得分:88)
typeof(Foo)
是静态类型查找;本质上它发生在编译时,所以你只得到明确命名的类型。
GetType()
是动态类型查找;它是一个在运行时被调用的虚方法,即使你使用多态也会给你确切的类型。从理论上讲,它“慢”,但是它会给你一些你无法从typeof(T)
获得的东西。如果你的设计需要一个或另一个,速度不会成为一个因素。
答案 1 :(得分:15)
除了性能问题之外,在提供的示例中,GetType
甚至不是一个选项,因为它是实例方法;它不能从字段初始化程序中调用。在任何情况下,由于意图是从静态“上下文”初始化静态字段,逻辑上this
引用不可用 - 所以沿着静态构造函数路由下去允许GetType
允许。
// Can't use GetType() - the this reference is not available.
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));