固定大小的字节数组

3
public : array<Byte>^ Foo(array<Byte>^ data)

获取动态大小的管理数组

但是我如何获得固定大小的管理字节数组呢?

我想强制C#用户向我发送8字节的数组;并获得8个字节的反馈。

样式:

public : Byte[8] Foo(Byte[8] data)

编辑:

有人可以解释为什么在安全上下文中不可能吗?


1
针对您的编辑:C# 的“安全”编程并没有“经过检查/验证长度的数组”的概念——如果您有一个接受byte[]类型作为参数的方法,该数组可以是null、长度为0或长度为213341。添加一行检查非常容易……固定缓冲区具有已知/定义的长度,但它们不是数组 - Marc Gravell
3个回答

7

C#不允许你这样做。你需要验证数组的长度,如果长度不是8,可能会抛出异常。

另外,你的函数类型不能是Byte[8],你需要将其更改为Byte[]


6
你可以在结构体内使用一个固定大小的缓冲区。不过需要放在不安全的块中实现。 (点击此处可查看更多信息)
unsafe struct fixedLengthByteArrayWrapper
{
    public fixed byte byteArray[8];
}

在C++中,您需要使用inline_array来表示此类型。
正如Marc所说,固定大小的缓冲区很难处理。您可能会发现运行时长度检查更加方便。

“fixed”缓冲区有点难以处理,而且并不适用于所有平台/部署。 - Marc Gravell
我不明白为什么要创建动态数组并处理异常,而不是更容易地修复数组大小,更不用说它无法静态检查了。 - Nahum
2
@NahumLitvin 的观点是:fixed 缓冲区不是数组;即使语法相似,也不能像数组一样对待它们。每次操作 fixed 缓冲区时,都需要同时使用 unsafefixed 语句(如果我没记错的话,fixed 语句会隐式执行固定操作)。在某些情况下,fixed 缓冲区可能非常有用,但个人建议将其作为实现细节而非 API 的一部分。 - Marc Gravell

6
如果您想要强制精确8字节,请考虑发送longulong。这很老式,但它有效。它还有一个优点,不需要一个对象(byte[]是一个对象)-它是一个纯值类型(在这种情况下是原始类型)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接