Как назвать исходные файлы С# для общих классов
Я пытаюсь придерживаться общих соглашений об именах, таких как описанные в Рекомендации по разработке для создания библиотек классов. Я помещаю каждый тип в свой собственный исходный файл (и частичные классы будут разделены на несколько файлов, как описано в вопросе Соглашения об именах для файлов 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
? Каковы ваши привычки?
Ответы
Ответ 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? Каковы ваши привычки?
Вышеупомянутая конвенция нестандартна; Я должен уточнить, что я отвечал "каковы мои привычки", а не обязательно "что вы должны делать".