c#命名空间:如何遵循标准而不引起恼人的冲突

本文关键字:冲突 命名空间 何遵循 标准 | 更新日期: 2023-09-27 18:06:10

我正在开发一个c#库(为了这个问题,我们就叫它"Foo"吧)。它有一些需求非常类似于标准的。net需求:例如,它提供了一些绘图服务和一些转换服务。

为了熟悉和库的用户能够猜测什么东西被称为,我希望遵循。net标准,并将库的这些部分命名为Foo。绘图和Foo。转换(等等)。但我发现在实际使用中,这会引起疼痛。人们几乎总是在每个文件的顶部有"using System;",当使用这个库时,他们也希望有"using Foo;"。但是现在他们有了两个绘图和两个转换模块,于是就有了乐趣。

例如,现在不只是使用绘图。对于参数或变量类型的颜色,必须显式地拼出System.Drawing。颜色,或者编译器抱怨Foo。绘图没有颜色类型。类似地,您希望使用标准的Convert。对于int32,你必须说system。convert。ToInt32,即使你已经在使用System,否则它会找到Foo。转换后找不到ToInt32.

我明白为什么这一切都是这样,但我仍然是c#社区的新手,所以我不知道哪个是最标准的解决方案:

  1. 保持这种方式,并期望用户在必要的地方使用完全限定的名称?
  2. 将冲突的模块重命名为其他东西(可能是Foo)。图形而不是Foo。绘图和Foo。转换而不是Foo.Convert)?
  3. 在标准名称(Foo。FDrawing和Foo.FConvert)?
  4. 别的吗?

如果有更有经验的c#大师给我建议,我将不胜感激!

c#命名空间:如何遵循标准而不引起恼人的冲突

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

using System;
using FConvert = Foo.Convert;
public class Bar
{
     public void Test()
     {
          var a = Convert.ToInt32("1");
          var b = FConvert.ToInt32("1");
     }
}

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

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

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

按自己的意愿命名类型,只要这些名称是有意义的,并且代表了类型的真实含义。库的客户端希望名为Animal的类型表示Animal,而不是其他类型。这同样适用于命名命名空间。

但是,无论如何都要避免使用System中的名称,因为对于您的库客户端(如您所描述的)来说,处理到处都是冲突的名称是非常烦人的。

处理类内部命名空间冲突的一种常用方法是使用命名空间别名:
 using FooConvert = Foo.Convert;
 using BarConvert = Bar.Convert;