Есть ли недостаток в использовании неуправляемых структур по ref? - PullRequest
0 голосов
/ 30 июня 2019

Во многих примерах API мы получаем IntPtr в качестве указателя на структуру, и я вижу, что люди выделяют новую память, копируют все данные, а затем создают новую структуру, насколько я понимаю.Или они используют Marshal.PtrToStructure ().Какая разница в использовании Marshal.PtrToStructure () и просто ref Struct?В случае, если мне просто нужно прочитать некоторые структурные данные.

[DllImport("some.dll")]
static extern IntPtr GetPoint(IntPtr point);

delegate IntPtr GetPointDelegate(IntPtr point);

// assing function that will be invoked
GetPointDelegate callback = ConsumePoint;

// delegate implementation
IntPtr ConsumePoint(IntPtr ptr)
{
    Point point = (Point)Marshal.PtrToStructure(ptr, typeof(Point));
    // do stuff with point
    return IntPtr.Zero;
}
[DllImport("some.dll")]
static extern IntPtr GetPoint(ref Point point);

delegate IntPtr GetPointDelegate(ref Point point);

GetPointDelegate callback = ConsumePoint;

IntPtr ConsumePoint(ref Point point)
{
    // do stuff with point
    return IntPtr.Zero;
}

Чем это отличается?Это переводится на то же самое?Или это более эффективно во втором способе, но есть некоторые опасности при его использовании?

...