簡體   English   中英

在C#中同時具有特定參數和params方法重載的好處

[英]Benefits of having both specific arguments and params method overloads in C#

.NET框架中有許多示例,其中有一個方法有多個重載,其中一些使用特定數量的參數,后跟最后的“catch all”,其中使用了params關鍵字。 這個例子的常見例子是String類,例如:

我想知道為什么有這么多這些方法重載的特殊原因? 起初我認為這可能與表現有關; 這個問題的問題和答案 - 在C#中使用params的成本 - 就是這樣的。

但是,我開始使用Reference Source網站深入研究.NET源代碼。 我在String類源代碼中注意到了這一點:

String.Concat()實際上運行不同的代碼取決於使用了多少固定參數 - 這在我看來肯定是一個優化。 然而, String.Format()似乎只提供了圍繞主param方法的包裝器 - 請參閱下面的釋義代碼:

public static String Format(String format, Object arg0)
{
    return Format(format, new Object[] { arg0 });
}

public static String Format(String format, Object arg0, Object arg1)
{
    return Format(format, new Object[] { arg0, arg1 });
}

public static String Format(String format, Object arg0, Object arg1, Object arg2)
{
    return Format(format, new Object[] { arg0, arg1, arg2 });
}

public static String Format(String format, params Object[] args)
{
    // Do work here...
}

那么有性能優勢還是僅僅是方便的問題,或者兩者兼而有之? 在上面的特定情況下,我沒有看到任何明顯的好處,它似乎只是重復工作。

它允許您創建調用該方法的每個簽名的委托:

Func<string, object, object> foo = string.Format;

這不適用於params方法; 您只能將該重載分配給Func<string, object[]>或在其簽名中專門提供params的委托。 您將被迫創建一個新方法,該方法只調用params重載來創建一個在他的示例中使用的簽名的委托(可能通過使用lambda)。

更新:它不是String.Concat而是String.Format。

我想這背后的原因是所有調用都以StringBuilder.AppendFormat結束,這非常復雜,如果你以不同的方式處理每一個輸入參數,它將成為代碼重復的主要來源。

如果你有一個重型API(如跟蹤),通過params重載調用方法的開銷非常大,情況會有所不同。 它可以高達5倍。對於LINQ常見的隱式委托分配也是如此。 這些臨時委托實例在優化代碼中並不便宜。 例如,Roslyn禁止使用LINQ,因為隱含的委托分配成本很高。

暫無
暫無

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

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