Как назвать исходные файлы C # для общих классов - PullRequest
38 голосов
/ 24 июня 2010

Я пытаюсь придерживаться общих соглашений об именах, таких как те, которые описаны в Руководство по разработке для разработки библиотек классов .Я помещаю каждый тип в его собственный исходный файл (и частичные классы будут разделены на несколько файлов, как описано в вопросе Соглашения об именах для файлов с частичным классом ), используя имя типа в качестве имени файла.

Примеры:

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 ]

40 голосов
/ 24 июня 2010

Я думаю, что общее решение этой проблемы - назвать файл следующим образом:

{ClassName}`{NumberOfGenericParameters}

Это даст вам следующее имя файла:

Bag.cs and Bag`1.cs

Это способ, которым Microsoft обрабатываетэта проблема в рамках, таких как Asp.net Mvc.

17 голосов
/ 24 июня 2010

Я видел некоторые библиотеки, использующие

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

, поскольку именно это и должно отображать Type.Name.

Я хочу быть более описательным с параметрами типа, поэтому в последнее время я склонен кuse

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

Этот формат также поддерживается комментариями XML.

/// <summary>
/// ...
/// Uses the <see cref="T:MyLibrary.Bag{TKey, TValue}" /> class.
/// </summary>
5 голосов
/ 24 июня 2010

Обычно, если у меня есть несколько типов, «перегруженных» числом параметров типа, это либо потому, что один происходит от другого, либо один используется для создания другого.Я просто помещаю их в один и тот же файл.

Один из альтернативных вариантов - разделить их на разные файлы, сделать один файл «основным», а остальные «зависеть» от него в файле сборки, так каксогласно частичному вопросу о классе, на который вы ссылались в этом вопросе.

Таким образом, вы можете получить визуальную ссылку в Visual Studio, но по-прежнему по одному классу на файл, чтобы упростить работу с ними.

1 голос
/ 30 июня 2015

В репозитории CoreFX GitHub Microsoft соблюдает соглашение об обратном тике , описанное в ответе Матиаса Якобссона :

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 { }
}
0 голосов
/ 24 июня 2010

Я добавляю суффикс '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? Какие у тебя привычки?

Приведенное выше соглашение является нестандартным; Я должен уточнить, что я отвечал «каковы мои привычки», а не обязательно «что вы должны делать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...