C# 中使用常量创建数组

发布于 2024-11-14 17:08:47 字数 420 浏览 1 评论 0原文

我确定已经在这里问过这个问题,但我找不到答案...
在 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(但我们知道我们不能......)。这是一个移植,我们不打算进行重大重写。

I'm sure this has been asked here already but I can't locate the answer...
In c we have this:

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

In c# we'd like this:

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

The array sizes are in a state of flux and we have them used across several files. We'd like to keep the #define (but we know we can't....). This is a port and we're not about to do major rewrites.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

还不是爱你 2024-11-21 17:08:47

将类型标记为“不安全”并使用固定大小缓冲区

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

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

或者,如果您只有其中三个,那么我会倾向于:

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

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

Mark the type as "unsafe" and use a fixed size buffer.

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

It is easy to get confused between the "fixed" declaration and the "fixed" statement. See my article on the subject if this is confusing.

Alternatively, if you only have three of them then I'd be inclined to:

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

Easy peasy, no messing around with crazy pointers. If there are only three of them, that's a good solution; if it's a 1000 byte struct then that might not be so hot.

始于初秋 2024-11-21 17:08:47

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

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

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

You can define a constants utility class to hold the "define"-like directives in C#:

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

struct Command
{
    byte opcode;
    byte[] arguments = new byte[Constants.CommandArgumentsSize];
}
2024-11-21 17:08:47

使用静态类封装

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

这些知识通常是一个更好的主意,但是只要您不在那里放置超过几个常量,这样的事情就不会很糟糕。

Use a static class

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

It's generally a better idea to encapsulate such knowledge but something like this would not be awful as long as you don't put more than a few constants in there.

爱情眠于流年 2024-11-21 17:08:47

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

Instead of #define use a public const in C#

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

Note: that you have "allocate" the byte array. I would use a class that preallocates:

 class Command {
    public const int ArgumentSize = 3;
    public byte opcode;
    public byte[] arguments = new byte[ArgumentSize];
 }
轻拂→两袖风尘 2024-11-21 17:08:47

您可以这样做:

unsafe struct Command
{
    const int CommandArgumentSize = 3;

    byte opcode;
    fixed byte arguments[CommandArgumentSize];
}

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

如果您只想使用它与某些非托管代码进行通信,那么使用 [MarshalAs(UnmanagementType.ByValArray)] 也可以达到目的。

You can do this:

unsafe struct Command
{
    const int CommandArgumentSize = 3;

    byte opcode;
    fixed byte arguments[CommandArgumentSize];
}

You have to allow unsafe code in your compiler to do this.

If you only want to use it for communication with some unmanaged code, using [MarshalAs(UnmanagedType.ByValArray)] should do the trick too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文