用c#中的常量创建数组

本文关键字:创建 数组 常量 | 更新日期: 2023-09-27 17:58:38

我确信这里已经问过了,但我找不到答案
在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(但我们知道我们做不到…)。这是一个端口,我们不会进行重大重写。

用c#中的常量创建数组

将类型标记为"不安全",并使用固定大小的缓冲区。

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

很容易混淆"固定"声明和"固定"语句。如果这令人困惑,请参阅我关于这个主题的文章。

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

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

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

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

public static class Constants
{
    public const int CommandArgumentsSize = 3;
}
struct Command
{
    byte opcode;
    byte[] arguments = new byte[Constants.CommandArgumentsSize];
}

使用静态类

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

通常情况下,封装这些知识是一个更好的主意,但只要你不在其中放入几个常量,这样的东西就不会太糟糕。

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

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

您可以这样做:

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

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

如果您只想将其用于与某些非托管代码的通信,那么使用[MarshalAs(UnmanagedType.ByValArray)]也可以。