2

我正在开发一个 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. 还有什么?

来自您更有经验的 C# 大师的任何建议将不胜感激!

4

2 回答 2

1

您可以使用命名空间别名:

using System;
using FConvert = Foo.Convert;

public class Bar
{
     public void Test()
     {
          var a = Convert.ToInt32("1");
          var b = FConvert.ToInt32("1");
     }
}
于 2014-06-02T14:26:15.523 回答
0

的主要用途之一namespaces是避免名称冲突

这意味着命名空间允许开发人员创建具有相同名称的类型,只要它们属于不同的命名空间。

一个库通常至少有一个根命名空间,并且可能有嵌套的命名空间,这些命名空间在逻辑上对相关类型进行分组。

只要名称有意义并代表类型的真正含义,就可以随意命名您的类型。您的库的客户需要一个名为的类型Animal来表示一个Animal,而不是其他东西。这同样适用于命名空间。

但是,请不惜一切代价避免使用来自 的名称System,因为对于您的图书馆客户(如您所描述的)来说,处理所有地方的冲突名称真的很烦人。

处理类中命名空间冲突的常用方法是使用命名空间别名

 using FooConvert = Foo.Convert;
 using BarConvert = Bar.Convert;
于 2014-06-02T14:28:53.973 回答