为什么 C# 方法有 2 个独立的标志:HasThis 和 IsStatic
Why do C# methods have 2 separate flags: HasThis and IsStatic
我一直在玩 Reflector 和 Reflexil,但是当我创建一个静态方法时,它不起作用。在某些方面,我发现方法有 2 个不同的 parameters/flags:IsStatic
和 HasThis
。
有什么区别?还是没有区别,其中一个标志只是未使用?我查看了扩展方法和构造函数,但是扩展方法被标记为普通静态方法,而构造函数被标记为普通成员方法(关于这 2 个标志)。
Reflexil 同时显示两组标志 - 在 IsStatic 的情况下来自方法定义的方法属性,以及在 的情况下来自方法签名定义的调用约定有这个。
方法属性包含有关特定方法的一般信息,如其可访问性、abstract/virtual/sealed 状态等(例如 Static
),而签名是方法采用的内容,returns以及如何,这可以分为几个调用约定。
托管调用约定为 DEFAULT
、VARARG
、HASTHIS
和 EXPLICITTHIS
。 HASTHIS
(CIL 中的 instance
)仅表示 this
实例作为第一个参数在内部传递给方法(由 ldarg.0
引用)。
HASTHIS
在只能使用方法签名的地方很有用,比如在函数指针或 calli
指令中(两者在 C# 中不可用,但在 C++/CLI 中不可用) ).但是,EXPLICITTHIS
在这些场合会更合适。
方法可能不需要 Static
标志,但字段肯定需要,因为它们没有调用约定,所以一致性可能是原因。
所以,从概念上讲它们有点不同,但从技术上讲是同一件事。
虽然理论上非静态方法可能不需要 this
引用,但同时设置两个标志是被禁止的,并且 ilasm 不允许我构造一个方法,同时打开或关闭两个标志,仅根据 static
关键字的存在设置它们。
扩展方法只是 C# 的东西,"this" 引用是方法的实际第一个参数,其余是语法糖。
我一直在玩 Reflector 和 Reflexil,但是当我创建一个静态方法时,它不起作用。在某些方面,我发现方法有 2 个不同的 parameters/flags:IsStatic
和 HasThis
。
有什么区别?还是没有区别,其中一个标志只是未使用?我查看了扩展方法和构造函数,但是扩展方法被标记为普通静态方法,而构造函数被标记为普通成员方法(关于这 2 个标志)。
Reflexil 同时显示两组标志 - 在 IsStatic 的情况下来自方法定义的方法属性,以及在 的情况下来自方法签名定义的调用约定有这个。
方法属性包含有关特定方法的一般信息,如其可访问性、abstract/virtual/sealed 状态等(例如 Static
),而签名是方法采用的内容,returns以及如何,这可以分为几个调用约定。
托管调用约定为 DEFAULT
、VARARG
、HASTHIS
和 EXPLICITTHIS
。 HASTHIS
(CIL 中的 instance
)仅表示 this
实例作为第一个参数在内部传递给方法(由 ldarg.0
引用)。
HASTHIS
在只能使用方法签名的地方很有用,比如在函数指针或 calli
指令中(两者在 C# 中不可用,但在 C++/CLI 中不可用) ).但是,EXPLICITTHIS
在这些场合会更合适。
方法可能不需要 Static
标志,但字段肯定需要,因为它们没有调用约定,所以一致性可能是原因。
所以,从概念上讲它们有点不同,但从技术上讲是同一件事。
虽然理论上非静态方法可能不需要 this
引用,但同时设置两个标志是被禁止的,并且 ilasm 不允许我构造一个方法,同时打开或关闭两个标志,仅根据 static
关键字的存在设置它们。
扩展方法只是 C# 的东西,"this" 引用是方法的实际第一个参数,其余是语法糖。