簡體   English   中英

C#-重載擴展方法

[英]C# - overloaded extension methods

在一個相當基礎的學習練習中,我使用了LinkedList,並且當需要返回最后一個元素時,我錯誤地使用了Last()方法代替了Last屬性,然后我開始懷疑。

此方法是IEnumerable的擴展方法,因此,如果未重載(Visual Studio + Resharper將向我顯示該方法的基本IEnumerable擴展方法簽名),則效率將非常低下。

LinkedList MSDN頁面將大多數擴展方法指定為“重載”。 但是我不確定這是什么意思(單擊方法鏈接會顯示基本方法的說明),為什么Visual Studio + Resharper不會向我顯示它。

謝謝。

with over . 一個容易犯的錯誤是在與混淆過 當MSDN頁面上說方法已重載時,這意味着方法的多個版本具有不同的參數。

您不能覆蓋擴展方法,因為它們是靜態的。

從技術上講,您不能“替代”擴展方法,因為它們是靜態的。 但是,如果類或接口上的方法與擴展方法具有相同的簽名,則編譯器將首選類或接口方法,而不是擴展方法。 所以通常以下行:

list.LastOrDefault()

...實際上將被編譯為:

Enumerable.LastOrDefault(list);

但是在下面的代碼中:

public class LinkedList2<T> : LinkedList<T>{
    public T LastOrDefault() {
        return Last.Value;
    }
}
...
var list = new LinkedList2<int>();
list.LastOrDefault();

編譯器實際上將調用LinkedList2.LastOrDefault()而不是Enumerable.LastOrDefault<T>(this IEnumerable<T>)

但是,由於LinkedList沒有Last()LastOrDefault()方法,您最終將調用效率非常低的Enumerable.Last()

暫無
暫無

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

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