![](/img/trans.png)
[英]Proper way to get a mutable struct for Memory<byte> / Span<byte>?
[英]Can I get a Span<byte> that references a struct member field of non-byte type?
說我有一個類似下面的結構:
struct MyStruct {
Guid g;
}
是否有可能獲得引用該結構字節的Span<byte>
?
struct MyStruct {
Guid g;
public void Foo() {
Span<byte> bytes = ???
}
}
這樣, bytes
將是長度為16的Span<byte>
,這將允許直接讀取和寫入Guid字段的各個字節。
我可以對不安全的代碼執行類似的操作,但似乎現在應該可以通過跨度的安全代碼來實現,但是我無法弄清楚如何產生跨度。
編輯:澄清一下,我想要一個跨度指向Guid的實際存儲位置。 意思是new Span<byte>(g.ToByteArray))
不是我要的。 這將分配一個新的數組,將字節復制到該數組,並創建一個引用新分配的數組的Span。 通過這樣的跨度修改字節不會修改Guid。
您可以將Guid
強制為數組
struct MyStruct {
public Guid g;
}
...
var s = new MyStruct();
var span = new Span<byte>(s.g.ToByteArray());
span[2] = 4;
注意 :以上內容不會修改原始結構。 但是,正如您指出的那樣,您可以在unsafe
執行此操作
var s = new MyStruct();
var span = new Span<byte>(&s , Marshal.SizeOf(s));
// woah it just become mutable
span[2] = 4;
在.Net Core 2.1或更高版本中嘗試以下操作:
Span<MyStruct> valSpan = MemoryMarshal.CreateSpan(ref mystruct, 1);
Span<byte> span = MemoryMarshal.AsBytes(valSpan);
但是請謹慎使用,因為GC可以移動引用類型,所以您的結構中不應包含任何指針或引用類型。 實際上,它將執行運行時檢查,並在執行時引發異常。
查看Span
類的構造函數,創建Span
的唯一方法是提供托管數組或指針。
但是Guid
由1個int,2個短褲和8個字節組成,而不是字節數組。
因此這是不可能的(至少現在不是這樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.