【发布时间】:2018-02-14 19:38:31
【问题描述】:
出于测试目的,我想做以下事情:
class ArrayOfStructWithRandomData<T> where T : struct {
private T[] array;
ArrayOfStructWithRandomData() {
array = new T[1000000];
InitializeArrayToRandomData();
}
}
如何在不使用 'unsafe' 关键字的情况下实现 InitializeArrayToRandomData()?
一个想法是使用Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)) * 1000000) 分配一块非托管内存,然后使用Marshal.Copy(Byte[], Int32, IntPtr, Int32) 用随机数据填充该内存,然后使用类似
static T[] GetArrayFromNativePointer<T>(IntPtr unmanaged_memory, int length) {
T[] result = new T[length];
if (IntPtr.Size == 4) {
int size = Marshal.SizeOf(typeof(T));
// 32-bit system.
for (int i = 0; i < result.Length; i++) {
result[i] = (T)Marshal.PtrToStructure(unmanaged_memory, typeof(T));
unmanaged_memory= new IntPtr(unmanaged_memory.ToInt32() + size);
}
} else {
long size = Marshal.SizeOf(typeof(T));
// Probably 64-bit system.
for (int i = 0; i < result.Length; i++) {
result[i] = (T)Marshal.PtrToStructure(unmanaged_memory, typeof(T));
unmanaged_memory= new IntPtr(array.ToInt64() + size);
}
}
return result;
}
有没有更好的办法?
【问题讨论】:
-
目的是什么?哪种类型的测试需要您创建可能无效的对象?
-
可能使用反射,您可以检索
T的字段并用随机值填充它们。 -
性能测试,我不希望编译器优化东西,因为它看到所有的结构都是默认初始化的。
-
我喜欢在这个例子中使用 Marshal 方法。我不确定为什么 PtrToStructure 在 for 循环中。
-
问题是,你所做的任何事情是 将是不安全的,因为没有办法通过泛型表达
struct只能包含struct成员。当您第一次使用包含引用的struct调用此方法并将该引用初始化为随机值时,就会引起欢闹。