All streams
Search
Write a publication
Pull to refresh
0
0
Send message

>>Также ничего не сказано про флаги, и про приколы с боксингом для методов 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 существуют и используются активно другими классами, для которых этот вопрос не стоит ребром.

Information

Rating
Does not participate
Registered
Activity