Подтвердить что ты не робот

Как назвать исходные файлы С# для общих классов

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

Примеры:

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? Каковы ваши привычки?

4b9b3361

Ответ 1

В репозитории CoreFX GitHub Microsoft придерживается соглашения back-tick, описанного в Маттиас Якобсон:

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

Ответ 2

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

{ClassName}`{NumberOfGenericParameters}

Это даст вам это имя файла:

Bag.cs and Bag`1.cs

Именно так Microsoft справляется с этой проблемой в таких рамках, как Asp.net Mvc.

Ответ 3

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

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>

Ответ 4

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

Одним из альтернативных вариантов было бы разбить их на разные файлы, сделать один файл "основным", а остальные "зависеть" от него в файле сборки, в соответствии с вопросом частичного класса, с которым вы связались в вопросе.

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

Ответ 5

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

Вышеупомянутая конвенция нестандартна; Я должен уточнить, что я отвечал "каковы мои привычки", а не обязательно "что вы должны делать".