>>Также ничего не сказано про флаги, и про приколы с боксингом для методов Enum, и почему оно вообще так было сделано. Также очень интересно, что enum не реализует IEquatable / IComparable, что ограничивает его применимость в дженериках <<
ответ был в поддержку этого, а таблички я назвал табличками, потому что так их назвал автор статьи. Табличка у него это как раз "имя" которое привязано к значению.
Читый Enum никто не использует до тех пора не нужно сделать какой-то Дженерик
Двумя ногами и руками за, меня после С++ вообще переполнило негодование. Вопрос у меня возник "Enum" в C# сделали для вывода списка табличек? Вот правда, но данная функция используется реже всех на свете функций, которые можно делать с Enum. 1) Чтобы работать с табличками нужны рефлексии и это используется еще реже
2) Чтобы вывести в терминал список значений - используется разве что в графических интерфейсах и/или для какого-то дебаггинга потому что обычно название табличек следует правилам оформления названия переменных и для интерфейса пользователя выглядит как-то не очень (разве что для какой-то утилиты на коленке для себя)
3) Метод HasFlag() > Flag1 &Flag2 == Flag2 реализовали
Метод HasAnyFlag() > Flag1 & Flag2 != 0 не реализовали.
В итоге если вам просто нужно сделать тривиальную проверку на биты - делайте ручками или лепите пулю из каки.
4) Как уже автор сказал Enum вообще не наследует никакие полезные интерфейсы, которые есть у обычных значимых типов. Ситуация накалилась после выхода Net.7. Разработчики объявили что они оптимизировали HasFlag(), но как уже сказано этой функции недостаточно. Любые попытки создать универсальный метод с Enum заставляет вас использовать боксинги, рефлексии или такие костыли как передача Enum в качестве long и далее работа с базовыми структурами.
5) Весьма непонятно почему не реализовано Implicit преобразование Enum в более значимые типы или равнозначные к UnderlyingType
6) Непонятно почему нельзя было как-то на уровне IDE оптимизировать оформление Enum чтобы они считались обычными базовыми типами, а все остальное было бы просто спрятано под алгоритмами IDE. Enum нельзя выбрать как значение по умолчанию, так как считается что это переменная времени исполнения.
В итоге такое ощущение что этот тип придумали ради того чтобы просто на курсах по C# для новичков показывать "какой крутой и мощный C#" . А на деле людям приходится создавать свои статические классы со статическими именованными константами для того чтобы их передавать как значение по умолчанию или как параметр в атрибуты.
И печально то, что особо никто не парится об этом и никаких подвижек в сторону переработки этой структуры нет и уже не будет (ведь как же совместимость)
Жду когда в каком-то .НЕТ100500 создадут адекватную штуковину.
Подскажите пожалуйста с таким нюансом. У меня есть узкое горлышко в программе. Нужно считывать поток данных из стрима и как можно быстрее. Есть карта, по которой определяется какой байт за что отвечает. Для ускорения обработки все поля этой карты выполнены вручную - последовательная пробежка под байтам через индексы и вызов метода записи в нужную переменную.
Есть стрим, в который записываются данные из другого стрима. Их порядок не совпадает, но нужно по возможности автоматизировать.
Если я буду использовать Enum - как delta, чтобы перемещаться по вложенному массиву - компилятор будет создавать константу в коде? или он будет высчитывать эту константу во время выполнения? Это важно опять же из-за соображений скорости.
writeAllItemsColourForFlatsToStream(int[] dataStream, int startIndex)
{
int delta = (int)Flat.max;
for (int i = 0; i < delta; ++i)
{
int curIndex = startIndex;
dataStream.Write(Tables[curIndex + i]);
curIndex += delta;
dataStream.Write(Cups[curIndex + i]);
curIndex += delta;
dataStream.Write(Walls[curIndex + i]);
}
}
Мне желательно сделать все через Enum, но если мой индекс будет опеределяться во время исполнения - я потеряю в скорости. Если же я сделаю через константы - тогда теряется смысл в самом C# , так как у меня везде будут int вместо именованного типа. А мои Enum существуют и используются активно другими классами, для которых этот вопрос не стоит ребром.
>>Также ничего не сказано про флаги, и про приколы с боксингом для методов Enum, и почему оно вообще так было сделано. Также очень интересно, что enum не реализует IEquatable / IComparable, что ограничивает его применимость в дженериках <<
ответ был в поддержку этого, а таблички я назвал табличками, потому что так их назвал автор статьи. Табличка у него это как раз "имя" которое привязано к значению.
Читый Enum никто не использует до тех пора не нужно сделать какой-то Дженерик
Двумя ногами и руками за, меня после С++ вообще переполнило негодование. Вопрос у меня возник "Enum" в C# сделали для вывода списка табличек? Вот правда, но данная функция используется реже всех на свете функций, которые можно делать с Enum.
1) Чтобы работать с табличками нужны рефлексии и это используется еще реже
2) Чтобы вывести в терминал список значений - используется разве что в графических интерфейсах и/или для какого-то дебаггинга потому что обычно название табличек следует правилам оформления названия переменных и для интерфейса пользователя выглядит как-то не очень (разве что для какой-то утилиты на коленке для себя)
3) Метод HasFlag() > Flag1 &Flag2 == Flag2 реализовали
Метод HasAnyFlag() > Flag1 & Flag2 != 0 не реализовали.
В итоге если вам просто нужно сделать тривиальную проверку на биты - делайте ручками или лепите пулю из каки.
4) Как уже автор сказал Enum вообще не наследует никакие полезные интерфейсы, которые есть у обычных значимых типов. Ситуация накалилась после выхода Net.7. Разработчики объявили что они оптимизировали HasFlag(), но как уже сказано этой функции недостаточно. Любые попытки создать универсальный метод с Enum заставляет вас использовать боксинги, рефлексии или такие костыли как передача Enum в качестве long и далее работа с базовыми структурами.
5) Весьма непонятно почему не реализовано Implicit преобразование Enum в более значимые типы или равнозначные к UnderlyingType
6) Непонятно почему нельзя было как-то на уровне IDE оптимизировать оформление Enum чтобы они считались обычными базовыми типами, а все остальное было бы просто спрятано под алгоритмами IDE. Enum нельзя выбрать как значение по умолчанию, так как считается что это переменная времени исполнения.
В итоге такое ощущение что этот тип придумали ради того чтобы просто на курсах по C# для новичков показывать "какой крутой и мощный C#" . А на деле людям приходится создавать свои статические классы со статическими именованными константами для того чтобы их передавать как значение по умолчанию или как параметр в атрибуты.
И печально то, что особо никто не парится об этом и никаких подвижек в сторону переработки этой структуры нет и уже не будет (ведь как же совместимость)
Жду когда в каком-то .НЕТ100500 создадут адекватную штуковину.
Подскажите пожалуйста с таким нюансом. У меня есть узкое горлышко в программе. Нужно считывать поток данных из стрима и как можно быстрее. Есть карта, по которой определяется какой байт за что отвечает. Для ускорения обработки все поля этой карты выполнены вручную - последовательная пробежка под байтам через индексы и вызов метода записи в нужную переменную.
Есть стрим, в который записываются данные из другого стрима. Их порядок не совпадает, но нужно по возможности автоматизировать.
Если я буду использовать Enum - как delta, чтобы перемещаться по вложенному массиву - компилятор будет создавать константу в коде? или он будет высчитывать эту константу во время выполнения? Это важно опять же из-за соображений скорости.
Пример:
Enum Colour { red, white, blue, green, black }
Enum Item { table, cup, wall, max }
Enum Flat { 401, 200, max }
int[] dataStream = new[(int)Flat.max * (int)Item.max];
int[] Tables= new[Flat.max];
int[] Cups= new[Flat.max];
int[] Walls= new[Flat.max];
int[] Flats= new[tem.max];
writeAllItemsColourForFlatsToStream(int[] dataStream, int startIndex)
{
int delta = (int)Flat.max;
for (int i = 0; i < delta; ++i)
{
int curIndex = startIndex;
dataStream.Write(
Tables
[curIndex + i]);
curIndex += delta;
dataStream.Write(
Cups
[curIndex + i]);
curIndex += delta;
dataStream.Write(
Walls
[curIndex + i]);
}
}
Мне желательно сделать все через Enum, но если мой индекс будет опеределяться во время исполнения - я потеряю в скорости.
Если же я сделаю через константы - тогда теряется смысл в самом C# , так как у меня везде будут int вместо именованного типа. А мои Enum существуют и используются активно другими классами, для которых этот вопрос не стоит ребром.