我花了很多时间处理非托管代码和 .NET 中的平台调用。下面的代码说明了一些让我感到困惑的事情,即非托管数据如何映射到 .NET 中的托管对象。
对于这个例子,我将使用RECT结构:
C++ RECT 实现(非托管 Win32 API)
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
C# RECT 实现(托管 .NET/C#)
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left, top, right, bottom;
}
好的,所以我的 C# 等效项应该可以工作,对吧?我的意思是,所有变量都与 C++ 结构的顺序相同,并且使用相同的变量名。
我的假设LayoutKind.Sequential
意味着非托管数据按照它出现在 C++ 结构中的相同顺序映射到托管对象。即数据将被映射,从左开始,然后是顶部,然后是右,然后是底部。
在此基础上,我应该能够修改我的 C# 结构......
C# RECT 实现(更简洁)
[StructLayout(LayoutKind.Sequential)]
public struct Rect //I've started by giving it a .NET compliant name
{
private int _left, _top, _right, _bottom; // variables are no longer directly accessible.
/* I can now access the coordinates via properties */
public Int32 Left
{
get { return _left; }
set { this._left = value; }
}
public Int32 Top
{
get { return _top; }
set { this._top = value; }
}
public Int32 Right
{
get { return _right; }
set { this._right = value; }
}
public Int32 Bottom
{
get { return _bottom; }
set { this._bottom = value; }
}
}
那么如果变量以错误的顺序声明会发生什么?大概这会破坏坐标,因为它们将不再映射到正确的东西?
public struct RECT
{
public int top, right, bottom, left;
}
猜测一下,这将像这样映射:
上=左
右=上
底部=右
左=底部
所以我的问题很简单,我的假设是否正确,我可以根据每个变量的访问说明符甚至变量名来修改托管结构,但我不能改变变量的顺序?