代码之家  ›  专栏  ›  技术社区  ›  Pierre Arnaud

如何命名通用类的C源文件

  •  38
  • Pierre Arnaud  · 技术社区  · 14 年前

    我试图坚持一些通用的命名约定,如 Design Guidelines for Developing Class Libraries . 我将每种类型放入它自己的源文件中(并且部分类将被拆分为几个文件,如所述) Naming Conventions for Partial Class Files ,使用类型的名称作为文件名。

    实例:

    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
    }
    

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

    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 ???
    }
    

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

    5 回复  |  直到 9 年前
        1
  •  40
  •   Mattias Jakobsson    14 年前

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

    {ClassName}`{NumberOfGenericParameters}
    

    这将为您提供以下文件名:

    Bag.cs and Bag`1.cs
    

    这就是微软在ASP.NET MVC等框架中处理这个问题的方式。

        2
  •  17
  •   herzmeister    14 年前

    我见过一些图书馆使用

    Bag.cs
    Bag`1.cs
    Bag`2.cs
    

    因为这是什么 Type.Name 会显示出来。

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

    Bag.cs
    Bag{T}.cs
    Bag{TKey, TValue}.cs
    

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

    /// <summary>
    /// ...
    /// Uses the <see cref="T:MyLibrary.Bag{TKey, TValue}" /> class.
    /// </summary>
    
        3
  •  5
  •   Jon Skeet    14 年前

    通常,如果我有几个类型被类型参数的数量“重载”,这可能是因为一个派生自另一个,或者一个用于创建另一个。我只是把它们放在同一个文件里。

    另一种选择是将它们分割成不同的文件,使一个文件成为“主”文件,而另一个则在构建文件中“依赖”它,这是根据您在问题中链接到的部分类问题而定的。

    这样,您就可以在Visual Studio中得到一个可视链接,但每个文件仍然有一个类,以便于使用它们。

        4
  •  1
  •   Community CDub    7 年前

    corefx github 存储库中,Microsoft遵循的是 back tick convention matthias jakobso中介绍n 的答案:

    所以基本上:

    class immutableArray//immutableArray.cs
    class immutablerray<t>//immutablerray`1.cs
    …
    class immutabledictionary<tkey,tvalue>//immutabledictionary`2.cs
    < /代码> 
    
    

    对于在其他类中定义的类,名称由外部类和后面的>+组成,并由内部类的名称(outer+inner.cs)组成:

    partial class immutableArray<t>//immutableArray`1+builder.cs
    {
    类生成器
    }
    < /代码> 
    存储库,Microsoft正在跟踪反勾号惯例描述于Matthias Jakobsson答案是:

    enter image description here

    所以基本上:

    class ImmutableArray { }                      // ImmutableArray.cs
    class ImmutableArray<T> { }                   // ImmutableArray`1.cs
    ...
    class ImmutableDictionary<TKey, TValue> { }   // ImmutableDictionary`2.cs
    

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

    partial class ImmutableArray<T>               // ImmutableArray`1+Builder.cs
    {
        class Builder { }
    }
    
        5
  •  0
  •   ChrisW    14 年前

    我在泛型类的名称中添加了后缀“t”。

    class Bag { }                           // in file Bag.cs 
    class BagT<T> : Bag { }                 // in file BagT.cs
    class BagInputs : BagT<Input>           // in file BagInputs.cs
    

    你问,

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

    我的上述惯例是不规范的;我应该澄清我回答的是“我的习惯是什么”,而不一定是“你应该做什么”。