簡體   English   中英

.NET 2.0中的C#擴展方法

[英]C# Extension methods in .NET 2.0

我找到了幾個鏈接到擴展方法在.NET2.0中運行的方法( The mothDiscord&RhymeStack Overflow )。 我還從一位同事那里隱約聽到這會導致圖書館或其他問題? 是這樣的嗎? 所有3個使用不同的方法:

飛蛾

namespace System.Runtime.CompilerServices
{
  public class ExtensionAttribute : Attribute { }
}

不和諧與押韻

namespace System.Runtime.CompilerServices
{
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
  public class ExtensionAttribute : Attribute {}
}

堆棧溢出

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class
         | AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute {}
}

這些方法之間的區別是什么,你會推薦哪一種?

最終它不會產生太大的影響; 您可能會認為匹配運行時的那個是首選,但理想的答案是切換到.NET 3.5(否則在以后它可能會混淆與范圍內相同屬性的不同版本等)。

[AttributeUsage]會防止它被連接到的東西,它不會做任何事情-但它本身不會做反正... aything

根據類型查看元數據,確切的屬性使用看起來最像是stackoverflow變體 - 但最終這並不是非常重要 - 名稱命名空間都很重要(並且它繼承自Attribute )。

差異很簡單:

在第一個示例中,您可以將屬性放在任何位置。 在第二個示例中,您只能將它應用於某個方法,對同一個方法只能應用一個方法,並且重寫方法的繼承類不會繼承該屬性。 在第三個示例中,您可以將其應用於方法,類或程序集。

如果您嘗試在任何其他地方應用它,您將收到編譯器錯誤。

第二個看起來最有意義。

我會推薦Discord和Rhyme,因為它為如何應用屬性提供了有意義的約束。

  1. 它只能應用於方法
  2. 您只能申請一次
  3. 該屬性無法繼承

就個人而言,我建議避免這三個。 每個選項都通過執行“技巧”來實現這一點 - 我不會依賴它來生成代碼。

如果要使用擴展方法,請升級到C#3.0。 否則,只需堅持使用非擴展方法語法調用該方法。

您可以隨時進行擴展方法調用:

public static class Utility {
    public static string Extension(this string original) { ... }

// call with:
var newString = myString.Extension();

並直接調用它:

string newString = Utility.Extension(myString);

這將與C#/。NET 2語法更加一致,並且將是我的建議。

SO版本是准確的版本,為了您應該使用它的准確性。

Fwiw,AttributeTarget.Method說明符非常清楚。 等級和裝配不那么重要。 C#和VB.NET編譯器都在包含擴展方法的靜態類/ Module上發出屬性。 並在包含類/模塊的程序集上。 為什么他們這樣做不太清楚,不需要正確編譯它們。 我猜這是一個優化工作,幫助編譯器和IntelliSense發現何時應該考慮擴展方法。

獲取應用於程序集的屬性實際上是一個問題。 當您將代碼編譯為.netmodules時,這將無法正常工作。 但這是一個非常模糊的問題。

暫無
暫無

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

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