使用C#中的结构来读取数据
假设我有一个如此定义的结构
struct Student { int age; int height; char[] name[12]; }
当我正在阅读二进制文件时,它看起来像
List students = new List(); Student someStudent; int num_students = myFile.readUInt32(); for (int i = 0; i < num_students; i++) { // read a student struct }
如何编写我的结构,以便我只需要说出一些内容
someStudent = new Student();
因此它将按照定义结构的顺序读取文件,并允许我根据需要使用语法来获取值
someStudent.age;
我可以将Student定义为一个类,并让构造函数读取数据并填充它们,但它没有getter / setter之外的任何方法,所以我认为结构更合适。
或者我使用类或结构无关紧要? 我见过其他人使用结构编写C代码来读取数据块,并认为这是一种“好”的方法。
如果要序列化/反序列化结构
如果你想读/写整个结构到二进制文件(序列化),我建议你看看
https://stackoverflow.com/a/629120/141172
或者,如果它是您的选项,请遵循@ Marc的建议并使用跨平台的序列化程序。 我个人建议protobuf-net恰好是由@Marc编写的。
如果您从任意文件格式加载
就像一个类一样 , struct可以有一个接受多个参数的构造函数。 实际上,通常明智的做法是不为结构提供setter。 这样做允许在构造结构之后更改结构的值,这通常会导致编程错误,因为许多开发人员都不理解struct是具有值语义的值类型这一事实。
我建议提供一个构造函数来初始化你的结构 ,将文件中的值读入临时变量,然后用构造函数构造结构。
public stuct MyStruct { public int Age { get; private set; } public int Height { get; private set; } private char[] name; public char[] Name { get { return name; } set { if (value.Length > 12) throw new Exception("Max length is 12"); name = value; } } public MyStruct(int age, int height, char[] name) { } }
进一步挖掘可变结构的危险(初始化后可以改变的结构)我建议
为什么可变结构“邪恶”?
AFAIK是一种内置于.NET中的低级直接布局结构读取器。 您想要查看BinaryReader,依次读取每个字段? 基本上,ReadInt32()两次,和ReadChars()。 要特别注意字符数据的编码 (ASCII?UTF8?UTF-16?)和整数的字节顺序 。
就个人而言,我更关注使用专用的跨平台序列化器!
上述就是C#学习教程:使用C#中的结构来读取数据分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998648.html