我确信这已经在这里被问过,但我找不到答案...... 在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(但我们知道我们不能......)。这是一个端口,我们不打算进行重大改写。
答案 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)]
也应该可以解决问题。