[英]Where to put extensions to a static class in a library? (in C#)
盡管我的問題通常是關於C#的,但我將通過舉一個具體的例子來提出這個問題。
我已經寫了一個函數EnsureDirectoryPresent
,它是.NET BCL庫中System.IO.Directory類的擴展。 我最好在哪里放這個新功能?
從概念上講,該方法是Directory類的擴展方法。 遺憾的是,它是一個靜態類,因此我無法使用該功能。
在.NET框架設計指南 (第2版)說把在孩子命名空間的類(或類)(如“...擴展”)。 這是為了允許程序員控制使用情況,不使用using指令將阻止可能不需要的擴展:
除非將擴展方法用於向接口添加方法或進行依賴項管理,否則請勿將擴展方法與擴展類型放在同一命名空間中。 當然,在后一種情況下,類型將在不同的組件中。
但是,該框架在某些地方違反了該指南的精神(例如,如果您使用XPathDocument
等,然后開始使用XML到LINQ,則System.Xml.XPath.Extensions
類將在范圍內)。
您不能擴展System.IO.Directory
,因為它是靜態類。 但你可以擴展System.IO.DirectoryInfo
-這是一個非靜態對口System.IO.Directory
。
然后,您將可以像這樣使用它:
(new DirectoryInfo(@"C:\Foo\Bar\Baz").EnsureDirectoryPresent();
您已經確定不能使用擴展方法將靜態方法附加到Directory
類。 在我看來,下一件最好的事情是簡單地為目錄相關的函數創建一個新的靜態類。 通常使用Utils
后綴。 我認為這是您最簡單的操作。
static class DirectoryUtils
{
public static void EnsureDirectoryPresent(string dir) { }
}
DirectoryUtils.EnsureDirectoryPresent(someDirectory);
那里語法上的唯一區別(與Directory
同名的靜態方法相反)是文本“ Utils”。 但是,“可發現性”與使用擴展方法不同-您必須了解DirectoryUtils
類。
擴展方法僅擴展實例方法。 您不能擴展類的靜態方法。 原因是將程序集加載到內存時,靜態方法本身就是類型,因此您實際上無法擴展它們。
此外,擴展方法比框架更具有編譯器/ IDE /語言功能。
更新
我在這里得到了否定-我認為這是不必要的-但這里是澄清:
擴展方法是通過使用靜態方法實現的,但是您可以從對象而不是類型中訪問它們。 因此,第一個參數始終是“ this”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.