[英]C# namespace alias - what's the point?
人們會在何處或何時使用命名空間別名,例如
using someOtherName = System.Timers.Timer;
在我看來,這只會增加理解語言的混亂。
那是一個類型別名,而不是一個命名空間別名; 消除歧義是有用的 - 例如,反對:
using WinformTimer = System.Windows.Forms.Timer;
using ThreadingTimer = System.Threading.Timer;
(ps: 感謝您選擇Timer
;-p)
否則,如果在同一個文件中同時使用System.Windows.Forms.Timer
和System.Timers.Timer
,則必須繼續提供全名(因為Timer
可能會造成混淆)。
它還與extern
別名一起發揮作用,用於使用來自不同程序集的具有相同完全限定類型名稱的類型 - 很少見,但支持它很有用。
實際上,我可以看到另一種用途:當您想要快速訪問類型,但不想使用常規using
因為您無法導入一些沖突的擴展方法時......有點令人費解,但是......這里有一個例子...
namespace RealCode {
//using Foo; // can't use this - it breaks DoSomething
using Handy = Foo.Handy;
using Bar;
static class Program {
static void Main() {
Handy h = new Handy(); // prove available
string test = "abc";
test.DoSomething(); // prove available
}
}
}
namespace Foo {
static class TypeOne {
public static void DoSomething(this string value) { }
}
class Handy {}
}
namespace Bar {
static class TypeTwo {
public static void DoSomething(this string value) { }
}
}
當我有多個具有沖突的子命名空間和/或對象名稱的命名空間時,我會使用它,您可以執行類似 [作為示例] 的操作:
using src = Namespace1.Subspace.DataAccessObjects;
using dst = Namespace2.Subspace.DataAccessObjects;
...
src.DataObject source = new src.DataObject();
dst.DataObject destination = new dst.DataObject();
否則必須寫成:
Namespace1.Subspace.DataAccessObjects.DataObject source =
new Namespace1.Subspace.DataAccessObjects.DataObject();
Namespace2.Subspace.DataAccessObjects.DataObject dstination =
new Namespace2.Subspace.DataAccessObjects.DataObject();
它節省了大量的輸入,可用於使代碼更易於閱讀。
除了上面提到的例子之外,當重復引用泛型類型時,類型別名(而不是命名空間別名)會很方便:
Dictionary<string, SomeClassWithALongName> foo = new Dictionary<string, SomeClassWithALongName>();
private void DoStuff(Dictionary<string, SomeClassWithALongName> dict) {}
相對:
using FooDict = Dictionary<string, SomeClassWithALongName>;
FooDict foo = new FooDict();
private void DoStuff(FooDict dict) {}
簡潔。
在共享類型名稱的命名空間之間提供清晰度有附帶好處,但本質上它只是糖。
我總是在這樣的情況下使用它
using Utility = MyBaseNamespace.MySubNamsepace.Utility;
否則Utility
將具有不同的上下文(如MyBaseNamespace.MySubNamespace.MySubSubNamespace.Utility
),但我希望/更喜歡Utility
始終指向該特定類。
當您在多個包含的命名空間中有多個具有相同名稱的類時,它非常有用。 例如...
namespace Something.From.SomeCompanyA {
public class Foo {
/* ... */
}
}
namespace CompanyB.Makes.ThisOne {
public class Foo {
/* ... */
}
}
您可以使用別名使編譯器滿意,並使您和您團隊中的其他人更清楚:
using CompanyA = Something.From.CompanyA;
using CompanyB = CompanyB.Makes.ThisOne;
/* ... */
CompanyA.Foo f = new CompanyA.Foo();
CompanyB.Foo x = new CompanyB.Foo();
我們為所有命名空間定義了命名空間別名。 這使得很容易看到一個類的來源,例如:
using System.Web.WebControls;
// lots of other using statements
// contains the domain model for project X
using dom = Company.ProjectX.DomainModel;
// contains common web functionality
using web = Company.Web;
// etc.
和
// User from the domain model
dom.User user = new dom.User();
// Data transfer object
dto.User user = new dto.User();
// a global helper class
utl.SomeHelper.StaticMethod();
// a hyperlink with custom functionality
// (as opposed to System.Web.Controls.HyperLink)
web.HyperLink link = new web.HyperLink();
我們已經定義了一些如何命名別名以及每個人都在使用它們的指南。
我發現別名在單元測試中非常有用。 在編寫單元測試時,通常的做法是將要測試的主題聲明為
MyClass myClassUT;
是myClassUT
主題ü的nDer牛逼EST。但是如果你想要編寫單元測試與靜態方法靜態類? 然后你可以創建一個這樣的別名:
using MyStaticClassUT = Namespace.MyStaticClass;
然后你可以像這樣編寫單元測試:
public void Test()
{
var actual = MyStaticClassUT.Method();
var expected = ...
}
並且您永遠不會忘記測試的主題是什么。
一方面,它在 Visual Studio 中編碼時非常方便。
用例:假設我只使用了幾個類,例如來自命名空間System.Data
SqlConnection
。 在正常情況下,我將在 *.cs 文件頂部導入System.Data.SqlClient
命名空間,如下所示:
using System.Data;
現在看看我的智能感知。 在代碼編輯器中打字時,大量的類可供選擇。 我根本不會使用一大堆類:
所以我寧願在我的 *.cs 文件頂部使用別名並獲得清晰的智能感知視圖:
using SqlDataCon = System.Data.SqlClient.SqlConnection
現在看看我的智能感知視圖。 它超級清晰,超級干凈。
我知道的一個原因; 當導入的命名空間發生名稱沖突時,它允許您使用較短的名稱。 例子:
如果您聲明using System.Windows.Forms;
並using System.Windows.Input;
在同一個文件中,當您訪問ModifierKeys
您可能會發現名稱ModifierKeys
在System.Windows.Forms.Control
和System.Windows.Input
命名空間中。 所以通過聲明using Input = System.Windows.Input;
然后您可以通過Input.ModifierKeys
獲取System.Windows.Input.ModifierKeys
。
我不是 C# 愛好者,但別名命名空間對我來說似乎是“最佳實踐”。 這樣你就知道你得到了什么,而且仍然不必輸入太多。
您可以使用它們非常輕松地修改代碼。
例如:
#if USE_DOUBLES
using BNumber = System.Double;
#else
using BNumber = System.Single;
#endif
public void BNumber DoStuff(BNumber n) {
// ...
}
public void BNumber DoStuff2(BNumber n) {
// ...
}
public void BNumber DoStuff3(BNumber n) {
// ...
}
通過指令的簡單更改,您可以決定您的整個代碼是在float
還是double
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.