用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(但我们知道我们做不到…)。这是一个端口,我们不会进行重大重写。
将类型标记为"不安全",并使用固定大小的缓冲区。
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)]
也可以。