C # Enum вопрос автоматического приведения == явное преобразование перечисления? - PullRequest
1 голос
/ 21 июня 2011

Я немного запутался с явными преобразованиями перечисления, что это действительно означает ...

Я пытаюсь использовать Перечисление, чтобы сделать довольно крутое ожидаемое поведение и действовать как хорошая замена магического числа одновременно ... убить двух зайцев одним выстрелом.

Я получил что-то вроде этого.

public enum Size {Bare, Fixed, VariableByte, VariableShort};

Прелесть ожидаемого поведения в том протоколе, с которым я работаю.

Если я просто отправляю пакет без какой-либо команды opcode, он называется Bare-пакетом, что означает, что размер буфера просто полезен, как

новый байт [payloadSize]; но [payloadSize + Bare] будет эквивалентно

byte[] buffer = new byte[payloadSize+Bare];   //Bare = 0

Если пакет фиксированный .. он содержит код операции, который должен быть добавлен впереди. так что это

новый байт [1 + полезная нагрузка];

byte[] buffer = new byte[payloadSize+Fixed] //Fixed of course = 1.

VariableByte содержит передний код операции и байт для представления размера пакета. Это для пакетов в диапазоне размеров 255 и т. Д., Который

новый байт [2 + полезная нагрузка];

VariableShort такой же, как указано выше, за исключением того, что размер пакета может быть словом 65535 полезной нагрузки. который

У меня могут возникнуть проблемы в будущем, если протокол когда-нибудь изменится, тогда мне, возможно, придется присваивать значения перечислению в будущем, чтобы исправить проблемы, но сейчас это допустимое перечисление, которое начинается с index = 0 [после поиска в Google I слышал, что если вы не запускаете перечисление со значением по умолчанию 0], то это неверное действительное перечисление .. lol idk, что это значит .. вероятно, ставит акцент на операции перечисления.

В любом случае вернемся к моему вопросу.

как я уже знаю, я могу сделать, например,

int Ret = (int)Size.Bare;

или

int Ret = Convert.ToInt32(Size.Bare);
byte[] packet = new byte[payloadSize+Ret]

или лучше.

byte[] packet = new byte[payloadSize+(int)Size.Bare]

Я стараюсь избегать как можно большего количества строк кода, возможно, даже повысить производительность.

Я читал MSDN и обнаружил, что вы можете сделать это .. Я действительно не обнаружил его цель, но я предсказываю, что это может означать ..

public enum Size : int {Bare, Fixed, VariableByte, VariableShort};

Я полагаю, это будет возможно

byte[] packet = new byte[payloadSize+Size.Fixed];

byte[] packet = new byte[payloadSize+Size.VariableShort];

и т.д ...

Но, к сожалению, это не так, и я получаю эту старую ошибку

Оператор '+' нельзя применить к операндам типа 'int' и Packet.Size

так что мне интересно, что на самом деле означает поставить байтовый код перед Enum? Поскольку это действительно не заставляет меня делать какие-то классные вещи, как я пытался выше.

Ограничивает ли это только приведение к байту ? или что-то или это просто старый только для внешности?

Кажется, ничего не ограничивает.

byte[] buffer = new byte[payloadZie+(byte)Size.Fixed];

Все еще работает и, конечно, int! = Byte .

Просто интересно, что бы это могло значить.
Спасибо, извините, если я задаю слишком много вопросов: \
Вы, ребята, даете лучшие ответы, чем любой период форума.

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Перечисление обеспечивает операторы переключения и сравнения, где вы сравниваете логические состояния или значения.(т.е. ConnectionState == Connected vs ConnectionState == 1).

Здесь вам нужны целочисленные значения.Однако вы можете написать класс с открытыми полями и / или свойствами, чтобы делать то, что вы хотите.Сделайте его статичным, и вы также обеспечите хорошую оптимизацию для компилятора / CLR.

public static class Sizes
{
    public static readonly int Bare = 0;
    public static readonly int VariableByte = 65536;
}

Вы можете использовать их таким же образом, но теперь, поскольку Sizes.Bare является целым числом со значением 0, вы можете использовать егов дополнении.

1 голос
/ 21 июня 2011

По умолчанию каждое значение перечисления имеет тип int, и первый элемент начинается с 0 и начинается обратный отсчет для каждого элемента (или, если вы определите [Flags] -атрибут до 2 ^ n).Если вы создаете перечисление с enum Size : byte, то каждый элемент будет иметь тип byte, а не int, который все еще явно приводится к int, но ограничен всего 256 элементами, так как у вас есть только «один байт чисел»,Поэтому, если вы хотите использовать перечисление в качестве «размера пакета», лучше выбрать перечисление int.

Большое преимущество перечислений над классом со статическими свойствами int состоит в том, что вы можете определитьenum, например, как тип параметра параметра метода, а затем будьте уверены, что вы получите действительное число, но если вы используете статические int s, вы можете определить параметры только как int, поэтому вам нужно проверить параметр, если ондействует каждый раз.

0 голосов
/ 21 июня 2011

Указание типа в объявлении перечисления заставляет его использовать этот тип только для хранения значений перечисления, но не меняет синтаксис при использовании значений перечисления.

Тип хранилища по умолчанию - int, поэтому указание, что перечисление должно использовать int, ничего не меняет, но все же полезно уточнить, что вы конкретно хотите использовать этот тип.


Если вы собираетесь использовать числовые значения перечислений, вы должны указать их в определении, а не полагаться на значения по умолчанию. Таким образом, из чтения кода становится ясно, что они должны иметь определенные значения:

public enum Size {
  Bare = 0,
  Fixed = 1,
  VariableByte = 2,
  VariableShort = 3
};
...