[英]How are extension methods compiled?
C#編譯器如何實現擴展方法?
該過程與重載決策完全相同:
Func(myObject);
編譯器檢查名為“Func”的所有函數,並嘗試將myObject的靜態類型與參數匹配(可能使用轉換,向上轉換為基類)。 如果成功,則調用適當的函數。
如果您意識到可以“以正常方式”調用擴展方法,那么它會清除:
static class MyExtensions
{
public static void MyFunc(this string arg)
{
// ...
}
}
string a = "aa";
MyExtensions.MyFunc(a); // OK
a.MyFunc(); // same as above, but nicer
對於給定的類型(此處為字符串),編譯器只在第一個參數上查找所有帶有“this”修飾符的靜態函數,並嘗試匹配左側的靜態類型。 (在此示例中為“a”),函數中包含參數類型。
類的實例方法具有隱藏參數。 一個例子:
class Example {
public void Foo(int arg) {}
}
當JIT編譯器完成它時,實際上看起來像這樣,轉換回C#語法:
static void Foo(Example this, int arg) {}
隱藏的參數是您可以在實例方法中使用它的原因。 JIT編譯器計算出從您提供的對象引用傳遞的參數,以調用Foo方法。
正如您所知,它現在是一個非常短暫的擴展方法。
編譯器首先在基類中查找與函數簽名匹配的函數。 如果它找不到它而不是尋找擴展名。 如果擴展名與基類方法具有相同的簽名,則調用基類方法。
這可能會有所幫助: 擴展方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.