我有一個由第三方庫提供的託管數組。數組的類型並不直接反映數組中存儲的數據,而是將數據解釋爲整數。將託管數組無法複製到結構數組中
所以int[] data = Lib.GetData();
給我一個整數數組,我想鑄成陣列的DataStructure
,可能看起來像這樣的。
struct DataStructure {
public int Id;
public double Value;
}
目前我使用Marshal.Copy
(實現可以被看作here),但似乎有點過分複製整個事情。
難道這樣的事情存在:
int[] data = Lib.GetData();
DataStructure[] dataStructs = InterpretAs<DataStructure>(data);
在不需要複製,但獲得dataStruct
元素可以像dataStruct[1].Id
做什麼?
編輯2:
如果我只想要一個可以DataStructure
,我可以用
public static T ToStruct<T>(byte[] bytes) where T : struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T something = Marshal.PtrToStructure<T>(handle.AddrOfPinnedObject());
handle.Free();
return something;
}
這裏不需要複製。
編輯:
的答案可能重複,目前大約7歲,他們由要麼複製數據或實施黑客攻擊。
即使在C中,這樣的構造也是UB(其中原始副本也取決於實現)。你可以想象在一個強大的類型系統的託管世界... –
@kasperhj你確定它會導致性能問題嗎?你真的需要[使其更快](http://ericlippert.com/2012/12/17/performance-rant/)?也許你可以要求第三方從他們的方法中提供更強的類型數據?在最壞的情況下,你可能會嘗試使用不安全的代碼(它應該允許做這樣的事情),但是在做之前你應該考慮兩次。 –
@EugenePodskal在我的應用程序中沒有任何性能問題,但只是爲了改變解釋而進行了很多複製。 – kasperhj