public : array<Byte>^ Foo(array<Byte>^ data)
動態獲取規模管理的陣列固定大小的字節數組
,但我怎麼能得到固定大小的管理字節數組?
我想強制C#用戶發送給我8個字節的數組;並獲得8個字節後面
風格:
public : Byte[8] Foo(Byte[8] data)
編輯:
可以ANY1解釋爲什麼它在安全的前提下impossbile?
public : array<Byte>^ Foo(array<Byte>^ data)
動態獲取規模管理的陣列固定大小的字節數組
,但我怎麼能得到固定大小的管理字節數組?
我想強制C#用戶發送給我8個字節的數組;並獲得8個字節後面
風格:
public : Byte[8] Foo(Byte[8] data)
編輯:
可以ANY1解釋爲什麼它在安全的前提下impossbile?
C#不允許你這樣做。你只需要驗證陣列的長度,如果長度不是8,可能會拋出異常。
此外,你的函數的類型不能是Byte[8]
;您必須將其更改爲Byte[]
。
您可以在結構中使用fixed size buffer。儘管如此,你仍然需要它在一個不安全的塊中。
unsafe struct fixedLengthByteArrayWrapper
{
public fixed byte byteArray[8];
}
在C++方面,您需要使用inline_array
來表示此類型。
正如Marc所說的,固定大小的緩衝區並不好玩。您可能會發現執行運行時長度檢查更方便。
儘管「固定」緩衝區有點痛苦,並且不適用於所有平臺/部署。 –
我不明白爲什麼。似乎更容易修復數組大小,而不是創建動態數組並處理異常,更不用說靜態檢查。 – Nahum
@NahumLitvin重點是; '固定'緩衝區***不是陣列***;你不能像數組一樣對待它們,即使語法可能相似。每次你觸摸一個'固定'緩衝區時,你都需要**'unsafe' *和''fixed'語句(它可以實現一個隱含的引腳IIRC)。 '固定'緩衝區在幾個場景中可能非常有用,但是我個人會將它們留作實現細節,而不是API的一部分 –
如果你想強制正好8個字節......考慮發送一個long
或ulong
來代替。老派,但它的作品。它也有不需要對象的優點(一個byte[]
是一個對象) - 它是一個純粹的值類型(在這種情況下是一個基元)
重新編輯:「安全」C#根本沒有「具有檢查/驗證長度的數組」的概念 - 如果你有一個方法需要'byte []',可以是'null',0-長度或長度213341.一行檢查很容易添加...'固定'緩衝區已知/定義長度,但它們不是數組**。 –