簡體   English   中英

在靜態上下文中調用c#擴展方法是否有效?

[英]Is it valid to call c# extension methods in a static context?

我正在使用編碼的UI,正在使用擴展方法,發現了一些有趣的東西。 我有一個擴展方法

public static bool Click (this UITestElement Element)
{//Code to Click Element and log any errors to framework logger}

后來我沒有想過再調用另一種方法

UITestElement Element = new UITestElement();
//Code to located element
Click(Element);

而且編譯器沒有抱怨。 我只是好奇,此用法是否有效,還是會出現運行時錯誤?

這就是擴展方法在后台工作的方式,在編譯時,其實例查找調用將轉換為靜態方法調用。

不會有任何運行時錯誤。

請參閱: 擴展方法(C#編程指南)

在您的代碼中,您將使用實例方法語法調用擴展方法。 但是,編譯器生成的中間語言(IL)將您的代碼轉換為對靜態方法的調用。

擴展方法只不過是靜態類內部的靜態方法,當第一個參數以this為前綴時,靜態方法會在編譯時綁定到實例方法調用。 您仍然可以像對待其他類一樣將它們視為靜態類上的靜態方法。 因此,這將起作用。

一個例子。 給出以下代碼:

void Main()
{
    int i = 0;
    i.Foo();
}

public static class IntExtensions
{
    public static int Foo(this int i)
    {
        return i;
    }
}

編譯器將發出以下IL(優化已關閉):

IL_0000:  nop         
IL_0001:  ldc.i4.0    
IL_0002:  stloc.0     // i
IL_0003:  ldloc.0     // i
IL_0004:  call        IntExtensions.Foo
IL_0009:  pop         
IL_000A:  ret     

如您所見,調用方法(IL_0004)的實際指令會在實際的靜態類上發出對靜態方法的call

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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