簡體   English   中英

C# 命名空間別名 - 有什么意義?

[英]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.TimerSystem.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您可能會發現名稱ModifierKeysSystem.Windows.Forms.ControlSystem.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.

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