Создание массива с константами в c # - PullRequest
0 голосов
/ 09 июня 2011

Я уверен, что об этом уже спрашивали, но я не могу найти ответ ...
В c мы имеем это:

#define COMMAND_ARGUMENTS_SIZE (3)
typedef struct
{
    unsinged char opcode; 
    unsigned char arguments[COMMAND_ARGUMENTS_SIZE];
} Command;

В c # нам бы хотелось:

struct Command
{
    byte opcode;
    byte arguments[...];
}    

Размеры массивов постоянно меняются, и мы используем их в нескольких файлах. Мы хотели бы оставить #define (но мы знаем, что не можем ....). Это порт, и мы не собираемся переписывать его.

Ответы [ 5 ]

4 голосов
/ 09 июня 2011

Отметьте тип как «небезопасный» и используйте буфер фиксированного размера .

unsafe struct Command 
{ 
  const int CommandArgumentsSize = 3;
  byte opcode;
  fixed byte arguments[CommandArgumentsSize];
}  

Легко запутаться между «фиксированной» декларацией и «фиксированной» инструкцией. См. Мою статью на эту тему, если это сбивает с толку.

В качестве альтернативы, если у вас есть только три из них, я был бы склонен:

struct Command 
{ 
  byte opcode;
  byte arg1;
  byte arg2;
  byte arg3;
}  

Легко peasy, не возиться с сумасшедшими указателями. Если их всего три, это хорошее решение; если это 1000-байтовая структура, то она может быть не такой горячей.

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

Вы можете определить вспомогательный класс констант для хранения директив, аналогичных определению в C #:

public static class Constants
{
    public const int CommandArgumentsSize = 3;
}

struct Command
{
    byte opcode;
    byte[] arguments = new byte[Constants.CommandArgumentsSize];
}
0 голосов
/ 09 июня 2011

Вы можете сделать это:

unsafe struct Command
{
    const int CommandArgumentSize = 3;

    byte opcode;
    fixed byte arguments[CommandArgumentSize];
}

Для этого вы должны разрешить небезопасный код в вашем компиляторе.

Если вы хотите использовать его только для связи с каким-то неуправляемым кодом, использование [MarshalAs(UnmanagedType.ByValArray)] также должно помочь.

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

Вместо #define используйте public const в C #

 struct Command {
    public const int ArgumentSize = 3;
    byte opcode;
    byte[] arguments;
 }

Примечание: вы должны «выделить» байтовый массив. Я бы использовал класс, который предварительно выделяет:

 class Command {
    public const int ArgumentSize = 3;
    public byte opcode;
    public byte[] arguments = new byte[ArgumentSize];
 }
0 голосов
/ 09 июня 2011

Используйте статический класс

static class Constants 
{
  public const int DEFAULT_ARRAY_SIZE = 20;
}

Обычно лучше инкапсулировать такие знания, но что-то вроде этого не будет ужасным, если вы поместите туда не более нескольких констант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...