繁体   English   中英

为什么在C#7.2中的结构中不能同时使用readonly和fixed-size缓冲区

[英]Why is it not possible to use both readonly and fixed-size buffers in structs in C# 7.2

随着C#7.2的发布,现在能够拥有readonly结构,在许多情况下可以提高性能。

对于我的一个结构,我使用固定大小的字节数组来实际保存数据。 然而,当我标志着struct和字节数组场readonly ,C#编译器抱怨readonly不是在球场上有效。 为什么我不能在struct的字段上同时使用fixedreadonly

readonly unsafe struct MyStruct {
  readonly fixed byte _Value[6]; //The modifier 'readonly' is not valid for this item.
}

因为C#规范是这样说的(并且它总是如此,甚至在c#7.2之前)。 在18.7.1节中,名为“固定大小缓冲区声明”, fixed缓冲区声明允许使用以下修饰符:

上市

保护

内部

私人的

不安全

这里没有readonly 如果你考虑它 - 它无论如何都没有多大意义,因为固定的缓冲区大小由指针表示,你不能重写对指针的写访问。 例如:

var s = new MyStruct();
byte* value = s._Value;
// how can you prevent writing to `byte*`?

C#文档从未明确说明这一点,所以我在这里进行推断。

一个简单的原因:C# 不需要您调用构造函数来初始化struct 您可以简单地声明它,然后为其所有公共成员分配值。 (在你问之前,是的,必须分配所有这些或者你会得到一个编译器错误。)

由于构造函数/ new不是必需的,因此不允许使用readonly变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM