使用c#中的常量创建数组

时间:2011-06-08 22:20:10

标签: c# arrays structure

我确信这已经在这里被问过,但我找不到答案...... 在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 个答案:

答案 0 :(得分:4)

将类型标记为“不安全”并使用fixed size buffer

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

很容易在“固定”声明和“固定”声明之间混淆。 See my article on the subject if this is confusing.

或者,如果你只有三个,那么我倾向于:

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

轻松自在,不会乱搞疯狂的指针。如果只有三个,这是一个很好的解决方案;如果它是一个1000字节的结构,那么可能不会那么热。

答案 1 :(得分:2)

您可以定义一个常量实用程序类来保存C#中的“define”类指令:

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

struct Command
{
    byte opcode;
    byte[] arguments = new byte[Constants.CommandArgumentsSize];
}

答案 2 :(得分:0)

使用静态类

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

封装这样的知识通常是一个更好的主意,但只要你不在这里放置一些常数,这样的东西就不会很糟糕。

答案 3 :(得分:0)

而不是#define在C#中使用public const

 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];
 }

答案 4 :(得分:0)

你可以这样做:

unsafe struct Command
{
    const int CommandArgumentSize = 3;

    byte opcode;
    fixed byte arguments[CommandArgumentSize];
}

您必须允许编译器中的不安全代码执行此操作。

如果您只想将它​​用于与某些非托管代码进行通信,那么使用[MarshalAs(UnmanagedType.ByValArray)]也应该可以解决问题。