C#命名空间别名 – 有什么意义?

我一直在努力学习更多关于C#语言的知识,但是我一直无法看到一种情况,就是像名称空间别名一样

using someOtherName = System.Timers.Timer; 

在我看来,这只会增加对语言理解的困惑。 有人可以解释一下吗?

谢谢

这是一个types别名,而不是一个名称空间别名; 消除歧义是有用的 – 例如,针对:

 using WinformTimer = System.Windows.Forms.Timer; using ThreadingTimer = System.Threading.Timer; 

(ps:感谢您selectTimer ;-p)

否则,如果在同一个文件中同时使用System.Windows.Forms.TimerSystem.Timers.Timer ,则必须保持全名(因为Timer可能会令人困惑)。

它也与extern别名一起使用,用于使用来自不同程序集的具有相同完全限定types名称的types – 罕见,但对于支持有用。


其实,我可以看到另一种用法:当你想快速访问一个types,但不想使用正则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(); 

它节省了大量的打字量,可以用来使代码更容易阅读。

除了上面提到的例子之外,当重复引用genericstypes时,input别名(而不是名称空间别名)

 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) {} 

简洁。

在共享types名称的命名空间之间提供附加的好处,但实际上它只是糖。

我总是在这样的情况下使用它

 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(); 

我们已经定义了一些指导,如何命名别名,每个人都在使用它们。

从某种意义上讲,在Visual Studio中进行编码确实非常方便。

用例 :比方说,我只需要使用less量的类,例如来自命名空间System.Data SqlConnection 。 在正常的过程中,我将导入* .cs文件顶部的System.Data.SqlClient命名空间,如下所示:

 using System.Data; 

现在看看我的智能感知。 在代码编辑器中input的时候,有很多类可供select。 我根本不会用到大量的课程:

在这里输入图像说明

所以我宁愿使用我的* .cs文件顶部的别名,并获得清晰的intellisense视图:

 using SqlDataCon = System.Data.SqlClient.SqlConnection 

现在看看我的intellisense观点。 它超级清晰,超级干净。

在这里输入图像说明

我发现别名在unit testing中非常有用。 当你正在编写unit testing的时候,通常的做法是把主题声明为test

 MyClass myClassUT; 

作为myClassUT的主题U nder T est。但是如果你想用静态方法编写静态类的unit testing呢? 然后你可以创build一个这样的别名:

 using MyStaticClassUT = Namespace.MyStaticClass; 

然后你可以这样编写你的unit testing:

 public void Test() { var actual = MyStaticClassUT.Method(); var expected = ... } 

而且你永远不会看到被测主题是什么。

我知道的一个原因 当您从导入的名称空间中导致名称冲突时,可以使用较短的名称。 例:

如果你声明using System.Windows.Forms;using System.Windows.Input; 在同一个文件中,当你去访问ModifierKeys你可能会发现ModifierKeys这个名字在System.Windows.Forms.ControlSystem.Windows.Input这两个命名空间中。 所以通过声明using Input = System.Windows.Input; 您可以通过Input.ModifierKeys获取System.Windows.Input.ModifierKeys

我不是C#的buff,但别名名称空间对我来说似乎是“最佳实践”。 这样你就知道你得到了什么,而且不必input太多。