簡體   English   中英

如何編譯擴展方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM