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.Timer
和System.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.Control
和System.Windows.Input
这两个命名空间中。 所以通过声明using Input = System.Windows.Input;
您可以通过Input.ModifierKeys
获取System.Windows.Input.ModifierKeys
。
我不是C#的buff,但别名名称空间对我来说似乎是“最佳实践”。 这样你就知道你得到了什么,而且不必input太多。