我正在研究一个C#库(为了这个问题,我们只是称它为“Foo”)。它有一些非常类似于标准.NET需求的需求:例如,它提供了一些绘图服务和一些转换服务。
为了熟悉并且库的用户能够猜出所调用的内容,我想遵循.NET标准,并命名库的这些部分Foo.Drawing和Foo.Convert(等等)上)。但我发现在实际使用中,这会导致疼痛。人们几乎总是“使用系统”;在每个文件的顶部,当使用这个库时,他们希望“使用Foo;”同样。但现在他们有两个绘图模板和两个转换模块,随之而来的是欢闹。
例如,现在不是仅使用Drawing.Color作为参数或变量类型,而是必须明确拼写出System.Drawing.Color,否则编译器会抱怨Foo.Drawing没有Color类型。类似地,你想使用标准的Convert.ToInt32,你必须说System.Convert.ToInt32,即使你已经在使用System,否则它会找到Foo.Convert并且找不到ToInt32。
我理解为什么这一切都是这样,但我还是C#社区的新手,所以我不知道哪个是最标准的解决方案:
任何来自更有经验的C#专家的建议都将不胜感激!
答案 0 :(得分:1)
您可以使用命名空间别名:
using System;
using FConvert = Foo.Convert;
public class Bar
{
public void Test()
{
var a = Convert.ToInt32("1");
var b = FConvert.ToInt32("1");
}
}
答案 1 :(得分:0)
namespaces
的一个主要用途是避免名称冲突。
这意味着名称空间允许开发人员创建具有相同名称的类型,只要它们属于不同的名称空间。
库通常至少有一个根命名空间,可能还有嵌套的命名空间,逻辑上对相关类型进行分组。
根据需要为您的类型命名,只要名称有意义并且代表类型的真实含义。库的客户端要求名为Animal
的类型代表Animal
,而不是其他类型。这同样适用于命名空间名称。
但是,不惜一切代价避免使用System
中的名称,因为对于您的图书馆客户(如您所描述的)来说,处理各地的冲突名称会非常烦人。
处理类中冲突的名称空间的常用方法是使用命名空间别名:
using FooConvert = Foo.Convert;
using BarConvert = Bar.Convert;