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

追_逐 2014-04-04 11:28:23
C# 中的结构体怎么样定义一个定长的数组成员?

比如C中的结构体为:

struct stru_test
{
int arrNumber[10];
}


在C#中应该怎么定义?

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


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

...全文
12253 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
追_逐 2014-04-08
  • 打赏
  • 举报
回复
引用 16 楼 BenBenBears 的回复:
如果是在字节流中读取结构体可以这么定义

        struct stru_use
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
            public  GLOBAL_WAYPOINT[] globalWaypoint;
        };
OK, 3Q
495711824 2014-04-08
  • 打赏
  • 举报
回复
各种胡说八道 class fuck{ public int[] aa = new int[7]; }
BenBenBears 2014-04-05
  • 打赏
  • 举报
回复
如果是在字节流中读取结构体可以这么定义

        struct stru_use
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
            public  GLOBAL_WAYPOINT[] globalWaypoint;
        };
追_逐 2014-04-05
  • 打赏
  • 举报
回复
啊哈哈哈.... 我找到一个工具,简单的试了一下,似乎挺好用的样子,先分享出来,去工程中看好不好用。 是一个大神博客: http://blog.csdn.net/Donjuan/article/details/3865026
追_逐 2014-04-05
  • 打赏
  • 举报
回复
引用 13 楼 xianfajushi 的回复:
既然转向C#为何还要用不安全模式?没说数组要固定,只是说定长.
额,不是转向C#,只是用C#调用C++ DLL。
cheng2005 2014-04-04
  • 打赏
  • 举报
回复
另外,宏定义这么丑陋的东西是被C#所抛弃的。 为什么不可以用const?
cheng2005 2014-04-04
  • 打赏
  • 举报
回复
引用 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));
如果试图赋值超过限定量则提示错误。
如果你可以不发这种错误代码误导别人那真是楼主的福气。
追_逐 2014-04-04
  • 打赏
  • 举报
回复
引用 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 有没有什么办法。难道真的要我用数字。这太扯淡了!
cheng2005 2014-04-04
  • 打赏
  • 举报
回复
    struct stru_test
    {
        public fixed int arrNumber[10];
    }
http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx
  • 打赏
  • 举报
回复

        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));
如果试图赋值超过限定量则提示错误。
  • 打赏
  • 举报
回复
既然转向C#为何还要用不安全模式?没说数组要固定,只是说定长.
追_逐 2014-04-04
  • 打赏
  • 举报
回复
引用 11 楼 wddw1986 的回复:
我的错,确实不行,看来我想多了 在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。 使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。 固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。
呵呵,兄弟,你掌握得很到位啊。小弟十分感谢! 虽然没能使用结构来做,不过我把结构体换成了类。数组的问题就算OK,算是解决了吧。 但是我还想请教一个问题就是:C# 中有没有办法可以取到一个变量的地址啊?
cheng2005 2014-04-04
  • 打赏
  • 举报
回复
引用 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]; 
};
[/quote] 我的错,确实不行,看来我想多了 在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。 使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。 固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。
追_逐 2014-04-04
  • 打赏
  • 举报
回复
引用 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]; 
};
cheng2005 2014-04-04
  • 打赏
  • 举报
回复
引用 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
出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。[/quote] 指定unsafe标签,在你的项目属性中勾选“允许不安全代码” 更多内容你可以在网上自行找寻答案[/quote] 3Q 你实在是帮了我大忙了,但是还有一个问题是结构体中的结构体数组,这个不不能用unsafe fixed ; 有什么别的方法没?[/quote] 结构体数组也可以用fixed 但是要求数组中的结构体是定长的,也就是这个结构体只包含值类型的字段。另外你用来交互的话推荐你自定义结构的布局。
追_逐 2014-04-04
  • 打赏
  • 举报
回复
引用 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
出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。[/quote] 指定unsafe标签,在你的项目属性中勾选“允许不安全代码” 更多内容你可以在网上自行找寻答案[/quote] 3Q 你实在是帮了我大忙了,但是还有一个问题是结构体中的结构体数组,这个不不能用unsafe fixed ; 有什么别的方法没?
cheng2005 2014-04-04
  • 打赏
  • 举报
回复
引用 6 楼 su_787910081 的回复:
[quote=引用 2 楼 wddw1986 的回复:]
    struct stru_test
    {
        public fixed int arrNumber[10];
    }
http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx
出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。[/quote] 指定unsafe标签,在你的项目属性中勾选“允许不安全代码” 更多内容你可以在网上自行找寻答案
追_逐 2014-04-04
  • 打赏
  • 举报
回复
引用 2 楼 wddw1986 的回复:
    struct stru_test
    {
        public fixed int arrNumber[10];
    }
http://msdn.microsoft.com/zh-cn/library/zycewsya.aspx
出现了一个错误:指针和固定大小缓冲区只能在不安全的上下文中使用。
VB 超强的API浏览器,带源码。   在VB.net、C#, 使用 DllImport 属性调用 Windows API, 请先使用 Imports 或 using 导入 System.Runtime.InteropServices 以简化声明的引用。 对于Any类型的转换,VB.NET/C# 不支持Any类型。如果你要把VB6式的API声明添加为VB.NET/C#支持的声明方式, 请使用特定的类型。在本软件对于有Any类型的函数添加时会提示你选择一种类型。在 Visual Basic 6.0 , Any类型的变量通常用于传递是字符串或 Null 的变量, 您可以通过声明两种(一种使用长型,一种使用字符串)来替换这种 Visual Basic 6.0 的用法。 易语言的函数、类型、常数声明是放在不同的地方的,不用分别复制, 只需全部复制, 任意粘贴到Dll命令、常量表、自定义数据类型声明处, 易语言会自动分开几种类型。 在声明C#结构体时如果结果体有数值数组类型, 结构体的这个成员会被声明成不安全代码, 若要正确编译代码 ,请在单击VS.net“项目”菜单“属性”菜单项, 在出来的选项卡上选择“生成”, 选那个选项卡的“允许不安全代码”项复选项, 这样才能正确编译。 VB.net与C#不支持类型(结构体)的某个变量同时是定长字符串与数组, 两者只能选其一。请自行计算出数组大小或用代码处理定长字符串的方式进行改写。   VB.net与C#的类型(结构体)如果有数组那么这个类型不能声明为类。

110,556

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧