C#中的类型/命名空间别名约定

jpi*_*son 13 c# alias namespaces naming-conventions

是否有任何已建立的命名或编码约定用于在C#中定义命名空间或类型别名

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

using Forms = System.Windows.Forms;
Run Code Online (Sandbox Code Playgroud)

我在网上看到的大多数示例都倾向于使用未缩写的大写名称作为别名,例如上面示例中的别名Forms.在某些地方,包括官方MSDN页面,该页面解释了命名空间System.CollectionscolAlias别名的示例.为了使其更复杂,根据是否定义了命名空间别名或类型别名,可能会优先选择一些指南.

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

因此,使用此技术,下面的复杂示例将变得更加可读,一旦应用了类型别名.

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

并且在使用类型别名的must clean版本下面.

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)
    {
        // ...
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

Jay*_*ggs 14

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

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

  • 但你必须承认,在我给出的示例中,如果你必须编写100多个类似的类,它们都具有相同的模式,类型别名功能可以显着提高可读性.虽然我同意它可能会让人感到困惑,但我认为在这种类型的例子中,实际上将复杂的例子保持原样并不会更加令人困惑. (2认同)

Ode*_*ded 9

命名空间别名不是大多数代码库的常见功能 - 我使用它时的最后一个地方,高级开发人员不熟悉它,尽管已经使用C#多年.

由于它很少见,因此尚未制定公约.

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

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

  • 命名空间的首字母缩写.通常是命名空间中的大写字母.
  • 命名空间的最后 - 如果复数去复数.
  • 描述性的短名称.


Cha*_*ion 6

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

using StringBuilder = System.Text.StringBuilder;
Run Code Online (Sandbox Code Playgroud)

如果重命名类型,则为维护程序员打开Pandora的框.