如何为泛型类命名C#源文件

Pie*_*aud 38 c# naming-conventions

我试图坚持一般的命名约定,如开发类库的设计指南中描述的那些.我将每种类型放入其自己的源文件中(部分类将按照部分类文件的命名约定中所述分成几个文件),使用类型名称作为文件名.

例子:

namespace Demo.Bla                         //  project
{
    enum FlowDirection { }                 //  in file FlowDirection.cs
    class LayoutManager { }                //  in file LayoutManager.cs
}

namespace Demo.Bla.LayoutControllers       //  folder LayoutControllers in project
{
    class StackPanelLayoutController { }   //  in file LayoutControllers/StackPanelLayoutController
}
Run Code Online (Sandbox Code Playgroud)

但我不确定我是否想出了一种聪明的方法来命名包含泛型类的源文件.假设我有以下类,例如:

namespace Demo.Bla.Collections             //  folder Collections
{
    class Map<T> { }                       //  in file Map.cs (obviously)
    class Bag { }                          //  in file Bag.cs (obviously)
    class Bag<T> : Bag { }                 //  also in file Bag.cs ???
}
Run Code Online (Sandbox Code Playgroud)

我应该将非泛型和泛型Bag类的代码放在同一个Bag.cs文件中吗?你的习惯是什么?

Mat*_*son 40

我认为这个问题的常见解决方案是将文件命名为:

{ClassName}`{NumberOfGenericParameters}
Run Code Online (Sandbox Code Playgroud)

这会给你这个文件名:

Bag.cs and Bag`1.cs
Run Code Online (Sandbox Code Playgroud)

这是Microsoft在Asp.net Mvc等框架中处理此问题的方式.


her*_*ter 17

我见过一些库使用

Bag.cs
Bag`1.cs
Bag`2.cs
Run Code Online (Sandbox Code Playgroud)

因为这是Type.Name显示的东西.

我希望对类型参数更具描述性,所以我最近倾向于使用

Bag.cs
Bag{T}.cs
Bag{TKey, TValue}.cs
Run Code Online (Sandbox Code Playgroud)

这是XML注释也支持的格式.

/// <summary>
/// ...
/// Uses the <see cref="T:MyLibrary.Bag{TKey, TValue}" /> class.
/// </summary>
Run Code Online (Sandbox Code Playgroud)

  • der welten - 谢谢你的建议。我喜欢将类型参数直接放入文件名的想法,而不是较短的反引号 + 数字命名方案。 (2认同)

Pie*_*aud 6

CoreFX GitHub存储库中,微软遵循Matthias Jakobsson的回答中描述的反引号约定:

在此输入图像描述

所以基本上:

class ImmutableArray { }                      // ImmutableArray.cs
class ImmutableArray<T> { }                   // ImmutableArray`1.cs
...
class ImmutableDictionary<TKey, TValue> { }   // ImmutableDictionary`2.cs
Run Code Online (Sandbox Code Playgroud)

对于在其他类中定义的类,名称由外部类后跟+和 内部类的名称组成 ( Outer+Inner.cs):

partial class ImmutableArray<T>               // ImmutableArray`1+Builder.cs
{
    class Builder { }
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这已经有一年了,但我想指出的是,您提供的 CoreFX 链接中不再使用这种命名方法。他们现在使用下划线代替勾号,使用句号代替加号。因此“ImmutableArray`1+Builder.cs”现在将是“ImmutableArray_1.Builder.cs” (3认同)

Jon*_*eet 5

通常,如果我有几种类型"超载"类型参数的数量,那么要么是因为一个派生自另一个,要么是一个用于创建另一个.我只是将它们放在同一个文件中.

一种替代选择是将它们分成不同的文件,使一个文件成为"主"文件,其他文件在构建文件中"依赖"它,根据您在问题中链接的部分类问题.

这样,您最终可能会在Visual Studio中使用可视链接,但每个文件仍然有一个类,以便更轻松地使用它们.