【发布时间】:2018-11-14 00:10:15
【问题描述】:
我正在尝试创建一个指针数组,以便能够跟踪对添加到其中的任何非管理对象的引用并对其进行更改,但是当我创建 Int的指针数组时,行为有所不同> 当创建一个 Persons 的指针数组时,什么是非托管的。
public unsafe struct Person
{
public char* name;
public int age;
public Person(string name, int age)
{
this.name = (char*)Marshal.StringToCoTaskMemAuto(name);
this.age = age;
}
}
添加:
public static unsafe void WriteValueAtPointerArrayIndex<T>(ref T** pointerArray, int index, in T value) where T : unmanaged
{
T** ptr = pointerArray;
fixed (T* ptrValue = &value)
{
ptr += index;
*ptr = ptrValue;
Console.WriteLine("Address where add: {0}, Value: {1}", (long)ptr, **ptr);
}
}
获取:
public static unsafe ref T* GetPointerValueAtPointerArrayIndex<T>(ref T** pointerArray, int index) where T : unmanaged
{
T** ptr = pointerArray;
ptr += index;
ref T* value = ref *ptr;
Console.WriteLine("Address to return: {0}, Value {1}", (long)ptr, *value);
return ref value;
}
使用方法:
UnsafeList 使用里面的方法并使用以下方法创建内部数组:
T**_Array = (T**)Marshal.AllocHGlobal(Marshal.SizeOf<T>() * _Capacity);
其中 T:非托管(.NET 4.7.3 的新特性)
UnsafeList<int> list = new UnsafeList<int>(10);
list.Add(10);
list.Add(14);
list.Add(20);
list.Add(25);
list.Add(30);
for(int i = 0; i < list.Length; i++)
{
var v = list[i];
}
与人一起使用:
UnsafeList<Person> persons = new UnsafeList<Person>(10);
Person miguel = new Person("Miguel", 23);
Person elena = new Person("Elena", 24);
Person ana = new Person("Ana", 34);
Person ulises = new Person("Ulises", 23);
persons.Add(miguel);
persons.Add(elena);
persons.Add(ana);
persons.Add(ulises);
for (int i = 0; i < persons.Length; i++)
{
var v = persons[i];
}
结果:
-
对于整数:
Address where add: 2151492103952, Value: 10 Address where add: 2151492103960, Value: 14 Address where add: 2151492103968, Value: 20 Address where add: 2151492103976, Value: 25 Address where add: 2151492103984, Value: 30
///这里只返回最后添加的但所有地址都正确
Address to return: 2151492103952, Value 30
Address to return: 2151492103960, Value 30
Address to return: 2151492103968, Value 30
Address to return: 2151492103976, Value 30
Address to return: 2151492103984, Value 30
-
对于人:
Address where add: 2151492060192, Value: Miguel, 23 Address where add: 2151492060200, Value: Elena, 24 Address where add: 2151492060208, Value: Ana, 34 Address where add: 2151492060216, Value: Ulises, 23 Address to return: 2151492060192, Value Miguel, 23 Address to return: 2151492060200, Value Elena, 24 Address to return: 2151492060208, Value Ana, 34 Address to return: 2151492060216, Value Ulises, 23
为什么使用 Int32 的结果不一致?我是 C# 指针的新手。
【问题讨论】:
-
您没有向我们展示 Add 方法。也许错误就在那里。
-
Add 方法只是 public void Add(in T value),它调用 WriteValueAtPointerArrayIndex
(...)
标签: c# pointers marshalling unmanaged .net-4.7.2