В моем текущем проекте я столкнулся с требованием создать универсальные классы с тем же именем, но с разным количеством универсальных параметров. Например:
MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>
Учитывая, что я хочу все это в одном пространстве имен, я не понимаю, как структурировать и назвать мои классы и файлы?
Если мы следуем идее, что у нас должен быть класс, ограниченный одним классом на файл, и что файлы должны быть в структуре папок, которая представляет иерархию пространства имен, и что имя файла должно совпадать с именем класса, как мне справиться с этой ситуацией? ?
Что я действительно спрашиваю здесь, это то, что я должен назвать файл, который содержит MyClass<T1>
, и как я должен назвать файл, который содержит MyClass<T1, T2>
? Я не спрашиваю, какими должны быть имена параметров типа.
TKey, TValue
соглашение. У Func естьTResult
параметр типа. Хотя я согласен , что вы можете использоватьT1
,T2
и т.д. для переменного числа входных параметров , которые в противном случае не имеют конкретных целей , какTKey
иTValue
.Ответы:
И так далее, где число после обратного кавычка - это число параметров универсального типа. Это соглашение используется Microsoft.
Кроме того, вы можете использовать что-то вроде
который сохраняет не только количество параметров универсального типа, но и их конкретные имена. Конечно, это не сохраняет угловые скобки, но мы не можем иметь в жизни все, что хотим, не так ли?
источник
В случае
Tuple
иAction
что Пит отметил, Microsoft сами используют единый файл - см Tuple.cs и Action.cs .Я думаю, что это частично зависит от того, одинаковы ли функциональные возможности для всех классов. Лично мне не нравится объединять классы в один файл, но это может быть исключением. В исходный код, где я работаю, я добавил автоматически сгенерированный (используя T4)
NamedTuple
класс, который действует так же, какTuple
и строковое имя в качестве первого аргумента в конструкторе.Чтобы ответить на ваш вопрос, если вы не хотите использовать один файл, возможно, используйте MyClass_1.cs для
MyClass<T1>
, MyClass_2.cs дляMyClass<T1, T2>
и т. Д.Однако ни один из этих вариантов не является идеальным, поэтому я был бы склонен предложить аргумент «Microsoft делает это таким образом, так что ...».
источник
Tuple
иAction
все делегаты; у них нет никакого кода реализации, поэтому помещать все варианты в отдельные файлы было бы в любом случае бессмысленно. Просто доказывает, что каждое правило имеет исключение.Tuple
не является делегатом, но каждая реализация в любом случае коротка.Func
.Вы спрашивали себя, действительно ли у классов такое же намерение? Если один класс является более универсальным, чем другой, то это будет GenericClass , MoreGenericClass и MostGenericClass . Представьте, что каждый параметр типа класса добавляет новое измерение в класс, так что это может помочь выяснить, что это за измерение.
Давайте возьмем этот пример:
Container<Thing>
MetricContainer<Thing, Metric>
MetricTransportableContainer<Thing, Metric, Transport>
Я знаю, что это не лучший пример, но очень выразительно, чтобы показать три измерения:
Таким образом, вы можете моделировать перевозки автомобилей:
Перевозка жидкостей:
Транспортировка энергии:
Перевозка сахара, крупы:
О, какой сюрприз: a
List<T>
имеет одно измерение, представляющее то, что может содержать список; и этоMap<T, S>
с двумя измерениями, которые представляют вещи, которые может содержать карта, и ключи доступа.источник
Tuple<T1>
,Tuple<T1, T2>
иTuple<T1, T2, T3>
в отдельные файлы CS стандартным способом, без имен столкновений?