[StructLayout(LayoutKind.Sequential)]
public struct Point 
{
   public int x;
   public int y;

谁帮我解释一下这段程序的意思,以及StructLayout的用途,用法.

解决方案 »

  1.   

    -----StructLayout特性 StructLayout特性允许我们控制Structure语句块的元素在内存中的排列方式,以及当这些元素被传递给外部DLL时,运行库排列这些元素的方式。Visual Basic结构的成员在内存中的顺序是按照它们出现在源代码中的顺序排列的,尽管编译器可以自由的插入填充字节来安排这些成员,以便使得16位数值用子边界对齐,32位数值用双字边界对齐。 使用这种排列(未压缩布局)提供的性能最佳。 在Visual Basic 6的用户自定义结构是未压缩的,而且我们不可以改变这一默认设置。在VB.NET中可以改变这种设置,并且可以通过System.Runtime.InteropServices.StructLayout 特性精确的控制每一个结构成员的位置。System.Runtime.InteropServices.StructLayout 允许的值有StructLayout.Auto StructLayout.Sequential StructLayout.Explicit. Imports System.Runtime.InteropServices <StructLayout(LayoutKind.Explicit)> _ Structure test ... End Structure StructLayout特性支持三种附加字段:CharSet、Pack、Size。 · CharSet定义在结构中的字符串成员在结构被传给DLL时的排列方式。可以是Unicode、Ansi或Auto。 默认为Auto,在WIN NT/2000/XP中表示字符串按照Unicode字符串进行排列,在WIN 95/98/Me中则表示按照ANSI字符串进行排列。 · Pack定义了结构的封装大小。可以是1、2、4、8、16、32、64、128或特殊值0。特殊值0表示当前操作平台默认的压缩大小。 Imports System.Runtime.InteropServices <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=4)> _ Structure test ... End Structure
      

  2.   

    楼上极其详细了,你可以查看msdn啊
      

  3.   

    [StructLayout(LayoutKind.Sequential)]
    public struct Point 
    {
       public int[] x=new int[];

    提示:结构中不能有实例字段初始值设定项;
    是不是结构里面不能定义数组的?
      

  4.   

    to 提示:结构中不能有实例字段初始值设定项;
    是不是结构里面不能定义数组的?结构不能在定义的时候,进行初始化,同时不能用new来初始化对象因此如下两种形式都是错误的
    struct Test
    {
         int i = 1;//Can't be compiled
    }struct Test
    {
         int[] i = new int[2];//Can't be compiled
    }
      

  5.   

    to 那我如何在结构体中定义数组呢?分离定义和初始化。
    分离的方法有两种,
    一个是在构造函数中进行初始化,但是有缺陷,毕竟无法屏蔽默认构造函数;
    struct Test
    {
    int[] i;
    public Test( int Num )
    {
         i = new int[Num];
    }
    }
    一个是通过属性来进行初始化。
    struct Test
    {
    private int[] i;
    public int[] I
    {
         get{ if( i == null ) i = new int[Num];
              return i;}
    }
    }