C# 中的结构体怎么样定义一个定长的数组成员?

时间:2022-08-30 19:08:54
C# 中的结构体怎么样定义一个定长的数组成员?

比如C中的结构体为:

struct stru_test
{
        int arrNumber[10];
}


在C#中应该怎么定义?

因为我在C#中使用构造函数,但是不允许有无参数的构造函数。
所以不知道怎么办了。


另外,C#中怎么使用#ifndef #define #endif 宏定义,是否可以使用?

18 个解决方案

#1



        public class Student
        {
            public int[6] Scores { get; set; }
        }



            Student aaa = new Student(); 
            aaa.Scores = new int[] { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(string.Join(" ", aaa.Scores));

如果试图赋值超过限定量则提示错误。

#2


    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx

#3


引用 1 楼 xianfajushi 的回复:

        public class Student
        {
            public int[6] Scores { get; set; }
        }



            Student aaa = new Student(); 
            aaa.Scores = new int[] { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(string.Join(" ", aaa.Scores));

如果试图赋值超过限定量则提示错误。


好吧,把结构体改成为class ,但是你知道c#中是否可以使用#define 定义宏吗?
如果不能的话,知道为什么 玫举不能定义无名的呢?
比如:enum { EnTest = 10000 };
这样编译通不过。
c#中好像也不能用const 有没有什么办法。难道真的要我用数字。这太扯淡了!

#4


引用 1 楼 xianfajushi 的回复:

        public class Student
        {
            public int[6] Scores { get; set; }
        }



            Student aaa = new Student(); 
            aaa.Scores = new int[] { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(string.Join(" ", aaa.Scores));

如果试图赋值超过限定量则提示错误。


如果你可以不发这种错误代码误导别人那真是楼主的福气。

#5


另外,宏定义这么丑陋的东西是被C#所抛弃的。
为什么不可以用const?

#6


引用 2 楼 wddw1986 的回复:
    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

#7


引用 6 楼 su_787910081 的回复:
Quote: 引用 2 楼 wddw1986 的回复:

    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

指定unsafe标签,在你的项目属性中勾选“允许不安全代码”
更多内容你可以在网上自行找寻答案

#8


引用 7 楼 wddw1986 的回复:
Quote: 引用 6 楼 su_787910081 的回复:

Quote: 引用 2 楼 wddw1986 的回复:

    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

指定unsafe标签,在你的项目属性中勾选“允许不安全代码”
更多内容你可以在网上自行找寻答案


3Q  你实在是帮了我大忙了,但是还有一个问题是结构体中的结构体数组,这个不不能用unsafe fixed ;
有什么别的方法没?

#9


引用 8 楼 su_787910081 的回复:
Quote: 引用 7 楼 wddw1986 的回复:

Quote: 引用 6 楼 su_787910081 的回复:

Quote: 引用 2 楼 wddw1986 的回复:

    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

指定unsafe标签,在你的项目属性中勾选“允许不安全代码”
更多内容你可以在网上自行找寻答案


3Q  你实在是帮了我大忙了,但是还有一个问题是结构体中的结构体数组,这个不不能用unsafe fixed ;
有什么别的方法没?

结构体数组也可以用fixed
但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。

#10


引用 9 楼 wddw1986 的回复:
结构体数组也可以用fixed
但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。


不明白什么是自定义结构的布局,不过这个不重要,如果方便的话,一两句话讲讲。

另外,我在结构体中定义一个结构体数组是编译不过的:

struct GLOBAL_WAYPOINT
{
        int  a;
        int  b;
        int  c;
        short  d;
        short e;
        short f;
        short g;
};

struct  stru_use
{
        // 编译时提示固定大小的缓冲区类型必须为基础数据类型
        public unsafe fixed GLOBAL_WAYPOINT globalWaypoint[100]; 
};


#11





引用 10 楼 su_787910081 的回复:
Quote: 引用 9 楼 wddw1986 的回复:


结构体数组也可以用fixed
但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。


不明白什么是自定义结构的布局,不过这个不重要,如果方便的话,一两句话讲讲。

另外,我在结构体中定义一个结构体数组是编译不过的:

struct GLOBAL_WAYPOINT
{
        int  a;
        int  b;
        int  c;
        short  d;
        short e;
        short f;
        short g;
};

struct  stru_use
{
        // 编译时提示固定大小的缓冲区类型必须为基础数据类型
        public unsafe fixed GLOBAL_WAYPOINT globalWaypoint[100]; 
};




我的错,确实不行,看来我想多了

在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。  使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。 固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。 

#12


引用 11 楼 wddw1986 的回复:
我的错,确实不行,看来我想多了

在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。  使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。 固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。 


呵呵,兄弟,你掌握得很到位啊。小弟十分感谢!
虽然没能使用结构来做,不过我把结构体换成了类。数组的问题就算OK,算是解决了吧。

但是我还想请教一个问题就是:C# 中有没有办法可以取到一个变量的地址啊?

#13


既然转向C#为何还要用不安全模式?没说数组要固定,只是说定长.

#14


引用 13 楼 xianfajushi 的回复:
既然转向C#为何还要用不安全模式?没说数组要固定,只是说定长.

额,不是转向C#,只是用C#调用C++ DLL。

#15


啊哈哈哈....
我找到一个工具,简单的试了一下,似乎挺好用的样子,先分享出来,去工程中看好不好用。
是一个大神博客:
 http://blog.csdn.net/Donjuan/article/details/3865026

#16


如果是在字节流中读取结构体可以这么定义

        struct stru_use
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
            public  GLOBAL_WAYPOINT[] globalWaypoint;
        };

#17


引用 16 楼 BenBenBears 的回复:
如果是在字节流中读取结构体可以这么定义

        struct stru_use
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
            public  GLOBAL_WAYPOINT[] globalWaypoint;
        };

OK, 3Q

#18


各种胡说八道
class fuck{
    public int[] aa = new int[7];
}

#1



        public class Student
        {
            public int[6] Scores { get; set; }
        }



            Student aaa = new Student(); 
            aaa.Scores = new int[] { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(string.Join(" ", aaa.Scores));

如果试图赋值超过限定量则提示错误。

#2


    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx

#3


引用 1 楼 xianfajushi 的回复:

        public class Student
        {
            public int[6] Scores { get; set; }
        }



            Student aaa = new Student(); 
            aaa.Scores = new int[] { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(string.Join(" ", aaa.Scores));

如果试图赋值超过限定量则提示错误。


好吧,把结构体改成为class ,但是你知道c#中是否可以使用#define 定义宏吗?
如果不能的话,知道为什么 玫举不能定义无名的呢?
比如:enum { EnTest = 10000 };
这样编译通不过。
c#中好像也不能用const 有没有什么办法。难道真的要我用数字。这太扯淡了!

#4


引用 1 楼 xianfajushi 的回复:

        public class Student
        {
            public int[6] Scores { get; set; }
        }



            Student aaa = new Student(); 
            aaa.Scores = new int[] { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(string.Join(" ", aaa.Scores));

如果试图赋值超过限定量则提示错误。


如果你可以不发这种错误代码误导别人那真是楼主的福气。

#5


另外,宏定义这么丑陋的东西是被C#所抛弃的。
为什么不可以用const?

#6


引用 2 楼 wddw1986 的回复:
    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

#7


引用 6 楼 su_787910081 的回复:
Quote: 引用 2 楼 wddw1986 的回复:

    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

指定unsafe标签,在你的项目属性中勾选“允许不安全代码”
更多内容你可以在网上自行找寻答案

#8


引用 7 楼 wddw1986 的回复:
Quote: 引用 6 楼 su_787910081 的回复:

Quote: 引用 2 楼 wddw1986 的回复:

    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

指定unsafe标签,在你的项目属性中勾选“允许不安全代码”
更多内容你可以在网上自行找寻答案


3Q  你实在是帮了我大忙了,但是还有一个问题是结构体中的结构体数组,这个不不能用unsafe fixed ;
有什么别的方法没?

#9


引用 8 楼 su_787910081 的回复:
Quote: 引用 7 楼 wddw1986 的回复:

Quote: 引用 6 楼 su_787910081 的回复:

Quote: 引用 2 楼 wddw1986 的回复:

    struct stru_test
    {
        public fixed int arrNumber[10];
    }

http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx


出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。

指定unsafe标签,在你的项目属性中勾选“允许不安全代码”
更多内容你可以在网上自行找寻答案


3Q  你实在是帮了我大忙了,但是还有一个问题是结构体中的结构体数组,这个不不能用unsafe fixed ;
有什么别的方法没?

结构体数组也可以用fixed
但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。

#10


引用 9 楼 wddw1986 的回复:
结构体数组也可以用fixed
但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。


不明白什么是自定义结构的布局,不过这个不重要,如果方便的话,一两句话讲讲。

另外,我在结构体中定义一个结构体数组是编译不过的:

struct GLOBAL_WAYPOINT
{
        int  a;
        int  b;
        int  c;
        short  d;
        short e;
        short f;
        short g;
};

struct  stru_use
{
        // 编译时提示固定大小的缓冲区类型必须为基础数据类型
        public unsafe fixed GLOBAL_WAYPOINT globalWaypoint[100]; 
};


#11





引用 10 楼 su_787910081 的回复:
Quote: 引用 9 楼 wddw1986 的回复:


结构体数组也可以用fixed
但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。


不明白什么是自定义结构的布局,不过这个不重要,如果方便的话,一两句话讲讲。

另外,我在结构体中定义一个结构体数组是编译不过的:

struct GLOBAL_WAYPOINT
{
        int  a;
        int  b;
        int  c;
        short  d;
        short e;
        short f;
        short g;
};

struct  stru_use
{
        // 编译时提示固定大小的缓冲区类型必须为基础数据类型
        public unsafe fixed GLOBAL_WAYPOINT globalWaypoint[100]; 
};




我的错,确实不行,看来我想多了

在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。  使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。 固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。 

#12


引用 11 楼 wddw1986 的回复:
我的错,确实不行,看来我想多了

在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。  使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。 固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。 


呵呵,兄弟,你掌握得很到位啊。小弟十分感谢!
虽然没能使用结构来做,不过我把结构体换成了类。数组的问题就算OK,算是解决了吧。

但是我还想请教一个问题就是:C# 中有没有办法可以取到一个变量的地址啊?

#13


既然转向C#为何还要用不安全模式?没说数组要固定,只是说定长.

#14


引用 13 楼 xianfajushi 的回复:
既然转向C#为何还要用不安全模式?没说数组要固定,只是说定长.

额,不是转向C#,只是用C#调用C++ DLL。

#15


啊哈哈哈....
我找到一个工具,简单的试了一下,似乎挺好用的样子,先分享出来,去工程中看好不好用。
是一个大神博客:
 http://blog.csdn.net/Donjuan/article/details/3865026

#16


如果是在字节流中读取结构体可以这么定义

        struct stru_use
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
            public  GLOBAL_WAYPOINT[] globalWaypoint;
        };

#17


引用 16 楼 BenBenBears 的回复:
如果是在字节流中读取结构体可以这么定义

        struct stru_use
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
            public  GLOBAL_WAYPOINT[] globalWaypoint;
        };

OK, 3Q

#18


各种胡说八道
class fuck{
    public int[] aa = new int[7];
}