CUrrently в процессе окончательного изучения C#. Но после использования C++ и python это одна вещь, которая продолжает ударять меня во время написания C#.Общий шаблон «идентификатор» в C#
C# не имеет аналогичной вещи для typedef
в C++. (Или, по крайней мере, htat истинно в соответствии с различными сообщениями здесь другие результаты поиска.
Теперь первое использование, чтобы «написать псевдоним», я могу понять (хотя из опыта не согласен - но это то, что я могу научиться принимать).
Однако есть другое применение, которое я привык к многому, особенно после использования python в течение многих лет: «Общий» шаблон. Там, где я на самом деле не забочусь о типе (и говорю, что мне все равно, что это могут сравниваться друг с другом). Теперь, конечно, общий класс может «сделать» это, но довольно часто это слишком много, особенно потому, что классы обычно имеют многие из них, и они мало важны для людей, которые используют этот класс.
пример, скажем, у меня есть словарь, который связывает «ценность» для некоторых «идентификаторов»:
System.Collections.Generics.Dictionary<string, double>
Был бы логичное начало. Однако скажите в будущем, имея более четкую картину всего приложения, я хочу изменить его. Я замечаю, что для вычислений мне действительно нужны десятичные значения вместо плавающей запятой - (или, может быть, даже бигновы вместо плавающих точек). Мне пришлось бы переменить весь мой код, изменив это. Подобно идентификатору: строки «легкие», но, возможно, в будущем я действительно не хочу использовать такие раздутые структуры. Скорее я использую что-то, что «может быть преобразовано из строк и является достаточно уникальным» в моем классе Или, в другом будущем, я, возможно, не захочу использовать общий словарь: вместо этого я реализую пользовательский для этого класса.
Все это потребует от меня изменения кода в разных местах. Потенциальная ошибка, и, таким образом, сопровождающий будет выбирать не изменять ее из-за проблем обслуживания.
На других языках я узнал, что это было разрешено либо «не заботьтесь» (python), либо разрешив typedef. И всегда использовать этот typedef, также в других классах.
Что такое идиоматический способ сделать это на C#? Общепризнано ли использование длинных «списков» общих переменных в определении вашего класса?
MyClass<A_KeyType, A_ValueType, B_KeyType, B_ValueType, ContainerType>
Кажется неудобным, поскольку не пользователь, но сопровождающий класс может часто знать, что лучше использовать?
Как очень упрощенно (глупый) пример
public class MyClass {
public MyClass() { }
private Systems.Collections.Generics.Dictionary<string, double> Points = new Systems.Collections.Generics.Dictionary<string, double>()
Public void AddPerson(string studentID, double val) {
Points.Add(studentID, val)
}
}
добытчики, возможно, смена и т.д. бы все должны явно ссылаться на Systems.Collections.Generics.Dictionary<string, double>
, хотя, возможно, в будущем studentID будет простое числовым значением или что-то другое. Также код «использование» этого, который «получает» идентификатор студента, должен понимать, что это строка.
В C++ я бы параметризуем тип студента «под» мой класс, как:
public class MyClass {
typedef string StudentIDType
...
Тогда я хотел бы использовать этот явный тип MyClass.StudentIDType
во всех ситуациях.
Не уверен, что я понимаю это право, но для меня вся концепция написания кода выглядит странно. Когда вы пишете код, вы должны знать, для чего он используется, какие данные задействованы и какие типы вам нужны. Однако есть что-то в C#, которое приблизилось бы к тому, что вы, похоже, ищете. 'var your_var = 1',' var' _type_ (это не тип), просто говоря, выбирает правильный тип для вас. Таким образом, вы можете пропустить все варианты выбора для ваших переменных. – r41n
У Python нет дженериков, а C++ использует * частную спецификацию шаблона *, а не 'typedef' или aliasing, чтобы делать то, что вы описываете. –
* «В будущем, когда я буду иметь более четкое изображение всего приложения, я хочу изменить его» * - звучит как перестройка для меня. В C# есть дженерики, они будут хорошо работать для * any * 'T'. Вы можете использовать интерфейсы, отражение, «Конвертировать», «Картпер», «Whatelseiforgot» для достижения независимости по типу ... – Sinatr