14

在 C#中定义命名空间或类型别名是否有任何既定的命名或编码约定?

对于那些不知道的人,C# 语言有一个特性,可以在文件的本地定义命名空间和类型的别名。当与第三方库发生命名冲突以及缩短代码中的类型名称时,这可能很有用。下面是它的外观示例。

using Forms = System.Windows.Forms;

我在网上看到的大多数示例都倾向于使用未缩写的大写名称作为别名,例如上面示例中的别名Forms。在某些地方,包括官方 MSDN 页面,该页面解释了命名空间System.Collections的别名colAlias的示例。为了使它更复杂,有些人可能会根据是否定义命名空间别名或类型别名来选择不同的准则。

为了说明我为什么对别名指南感兴趣的一些背景知识,我将解释我在做什么。在最近的一个项目中,我开始简化一个模式,其中我有几个类继承自一个通用基类,该基类通过使用类型别名来接受复杂类型参数。

因此,使用这种技术,一旦应用了类型别名,下面的复杂示例就会变得更具可读性。

public class MyClass: MyGenericBaseClass<TripleLindyFancyAlgorithm<List<SomeValueType>>, List<SomeValueType>>
{
    public override List<SomeValueType> DoSomething(TripleLindyFancyAlgorithm<List<SomeValueType>> operation)
    {
        // ...
    }
 }

并且在使用类型别名的必须更清洁的版本之下。

using Result = List<SomeValueType>;
using Algorithm = TripleLindyFancyAlgorithm<List<SomeValueType>>; // Note: cannot reference an alias within an alias definition!

public class MyClass: MyGenericBaseClass<Algorithm, Result>
{
    public override Result DoSomething(Algorithm operation)
    {
        // ...
    }
 }

尽管这看起来更简单,但很容易忘记诸如Result之类的别名实际上只是 List 的别名,并且没有称为Result的实际类型。为了在视觉上分离概念,我正在考虑遵循一些前缀约定,类似于在私有成员之前使用下划线“_”,以帮助区分类型别名和实际类型。但是,在我这样做之前,我想确保我没有重新发明轮子,因为可能已经有更成熟的约定。

4

7 回答 7

14

我只会在命名空间冲突的情况下使用别名(即只有在我必须这样做时)。

至少对我来说,任何其他用途都只是令人困惑和分心。

于 2009-10-29T20:14:35.437 回答
9

命名空间别名不是大多数代码库的共同特征——我最后一次使用它时,高级开发人员对它并不熟悉,尽管已经使用 C# 多年。

由于它很少见,因此尚未为其制定约定。

我想说,如果您要使用别名,请与您的团队讨论以创建您自己的约定。

我看到使用别名的几种不同方式:

  • 命名空间的首字母缩写词。通常是命名空间中的大写字母。
  • 命名空间的最末端 - 如果复数被取消复数。
  • 一个描述性的短名称。
于 2011-12-09T19:15:06.590 回答
6

就个人而言,我只会用它来保持智能感知清洁。

using StringBuilder = System.Text.StringBuilder;

如果重命名类型,则会为维护程序员打开潘多拉魔盒。

于 2009-10-29T20:14:32.623 回答
4

命名空间别名最常见的两种情况是:

  1. 我看到它并使用它(作为一种趋势)
  2. 我从另一种语言移植代码

对于第一种情况,不予置评。对于第二个例子,一个很好的例子是从 C 移植代码并使用命名空间别名来实现实用性,例如:

using i64 = System.Int64;
using u8 = System.Byte;
using u32 = System.UInt32;
using u64 = System.UInt64;

即使您将上述别名视为惰性编程,它们也有助于避免错误。

于 2011-12-11T19:49:41.163 回答
2

我认为那些根本不使用它们的人正在给出你所要求的答案。那就是约定。这并不是说它没有用,但不使用它仍然是常态。

于 2011-12-15T00:37:47.070 回答
2

您可以采用约定将它们用于抽象。

using Id = System.Int32;

这样您就可以轻松地将该行替换为

using Id = System.Guid;

在某些时候,无需更改其他代码(假设您没有通过抽象来创建对实际类型的依赖项......)

于 2012-05-05T22:15:27.007 回答
0

我通常只在需要在不同的命名空间中使用两个类似命名的类时才使用它们,并且不想在代码中完全指定类型:

using xItem = My.Project.NameSpace.Item;
using yItem = Your.ThirdParty.Framework.Item;
于 2013-04-11T14:30:27.423 回答