C#名称空间:如何遵循标准而不会引起恼人的冲突?

时间:2014-06-02 14:15:04

标签: c# namespaces conflict name-conflict

我正在研究一个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#社区的新手,所以我不知道哪个是最标准的解决方案:

  1. 保持这种方式,并希望用户在必要时使用完全限定名称?
  2. 将冲突的模块重命名为其他东西(可能是Foo.Graphics而不是Foo.Drawing,而Foo.Conversion而不是Foo.Convert)?
  3. 在标准名称上使用一些前缀(Foo.FDrawing和Foo.FConvert)?
  4. 别的什么?
  5. 任何来自更有经验的C#专家的建议都将不胜感激!

2 个答案:

答案 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;