c# - 为什么不能在 C# 7.2 的结构中同时使用只读缓冲区和固定大小缓冲区

标签 c# struct unsafe 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 缓冲区声明允许使用以下修饰符:

new

public

protected

internal

private

unsafe

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

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

关于c# - 为什么不能在 C# 7.2 的结构中同时使用只读缓冲区和固定大小缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47736478/

相关文章:

java - 使用 Unsafe 类在同步块(synchronized block)上编写原子有什么好处?

c# - 在 C# 中从 Windows Media Player 上播放的视频中获取图像

c# - Dapper 在 ID 列上返回 SQL 转换错误

具有两个结构的 C 迭代

rust - 是否可以让通用 Rust T 始终分配堆?

c# - 算术运算导致不安全 C# 中的溢出

c# - Silverlight XAML 对象的二进制序列化

c# - 使用 Moq 模拟不安全的接口(interface)

c - 是否允许对 "compatible"结构体的结构体指针进行转换和取消引用?

c - 期望结构指针但获取结构,反之亦然