C#名称空间:如何遵循标准而不引起恼人的冲突?
我正在研究一个C#library(为了这个问题,我们就叫它“Foo”)。它有一些与标准.NET需求非常相似的需求:例如,它提供一些绘图服务和一些转换服务 为了熟悉和让库的用户能够猜出东西的名称,我希望遵循.NET标准,并将库的这些部分命名为Foo.Drawing和Foo.Convert(等等)。但我发现在实际使用中,这会引起疼痛。人们几乎总是在每个文件的顶部有“using System;”,当使用这个库时,他们也希望有“using Foo;”。但现在他们有了两个绘图模块和两个转换模块,欢闹随之而来 例如,现在,您必须显式拼写System.Drawing.Color,而不是仅使用Drawing.Color作为参数或变量类型,否则编译器会抱怨Foo.Drawing没有颜色类型。类似地,如果要使用标准Convert.ToInt32,即使您已经在使用System,也必须使用System.Convert.ToInt32,因为否则它会找到Foo.Convert,而找不到ToInt32 我理解这一切的原因,但我对C#社区还是新手,所以我不知道哪种解决方案是最标准的:C#名称空间:如何遵循标准而不引起恼人的冲突?,c#,namespaces,conflict,name-conflict,C#,Namespaces,Conflict,Name Conflict,我正在研究一个C#library(为了这个问题,我们就叫它“Foo”)。它有一些与标准.NET需求非常相似的需求:例如,它提供一些绘图服务和一些转换服务 为了熟悉和让库的用户能够猜出东西的名称,我希望遵循.NET标准,并将库的这些部分命名为Foo.Drawing和Foo.Convert(等等)。但我发现在实际使用中,这会引起疼痛。人们几乎总是在每个文件的顶部有“using System;”,当使用这个库时,他们也希望有“using Foo;”。但现在他们有了两个绘图模块和两个转换模块,欢闹随之而
任何来自更有经验的C#gurus的建议都将不胜感激 您可以使用命名空间别名:
using System;
using FConvert = Foo.Convert;
public class Bar
{
public void Test()
{
var a = Convert.ToInt32("1");
var b = FConvert.ToInt32("1");
}
}
名称空间的主要用途之一是避免名称冲突
这意味着名称空间允许开发人员创建具有相同名称的类型,只要这些类型属于不同的名称空间
一个库通常至少有一个根名称空间,可能还有嵌套的名称空间,可以对相关类型进行逻辑分组
只要名称有意义并代表类型的真正含义,就可以根据需要命名类型。库的客户端希望名为Animal
的类型表示Animal
,而不是其他类型。这同样适用于命名名称空间
但是,要不惜一切代价避免使用系统中的名称
,因为对于您的图书馆客户(如您所述)来说,处理各地相互冲突的名称会非常烦人
处理类内冲突的名称空间的一种常见方法是使用名称空间别名:
using FooConvert = Foo.Convert;
using BarConvert = Bar.Convert;
我不清楚你的意思-是Foo.Drawing
另一个名称空间,还是类型?我肯定会尽量避免在系统中出现与公共类型冲突的类型名
…我为每个库选择一个名称空间。为什么绘图
是一个问题?没有System.Drawing
类。有一个System.Drawing命名空间(),还有一个Foo.Drawing命名空间,这是导致使用Foo比应该的更烦人的几个冲突之一。等等,不,这不太正确。画画是一门课。System.Drawing是一个名称空间,而不是一个类,但我看不出这有什么帮助--当我在Foo名称空间中并尝试使用(比如)Drawing.Color时,我仍然会遇到冲突,因为编译器似乎在寻找Foo.Drawing.Color,而它并不存在。好的,我很感谢您花时间编写这样一个好的解释,但我真的觉得不清楚该怎么办。你的“不惜一切代价避免系统中的名字”建议符合我自己的直觉。。。那我该怎么办呢?让我们以转换为例;当然,库中有需要转换的类型并不少见。我应该将其命名为Convert并让人们使用名称空间别名(或完全限定名)来处理它,还是将其命名为其他名称以避免冲突?