1

そのように定義された構造体があるとします

struct Student
{
  int age;
  int height;
  char[] name[12];
}

バイナリファイルを読んでいるとき、それは次のようになります

List<Student> students = new List<Student>();
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 をクラスとして定義し、コンストラクターにデータを読み取らせてデータを入力させることもできますが、ゲッター/セッター以外のメソッドがないため、構造体の方が適切だと思いました。

それとも、クラスを使用するか構造体を使用するかは問題ではありませんか? 他の人が構造体を使用してデータのブロックを読み取る C コードを記述しているのを見て、それが「良い」方法であると考えました。

4

2 に答える 2

1

私の知る限り、.NETに組み込まれた低レベルの直接レイアウト構造体リーダーはありません。BinaryReader を見て、各フィールドを順番に読みたいと思いませんか? 基本的に、ReadInt32() を 2 回、ReadChars() を 2 回実行します。文字データのエンコーディング(ASCII? UTF8? UTF-16?) と整数のエンディアンに特に注意してください。

個人的には、専用のクロスプラットフォーム シリアライザーの使用を検討したいと思います。

于 2012-08-10T21:17:58.130 に答える
0

構造体をシリアライズ・デシリアライズしたい場合

構造体全体をバイナリ ファイル (シリアル化) に読み書きする場合は、以下を参照することをお勧めします。

https://stackoverflow.com/a/629120/141172

または、それがオプションである場合は、@Marc のアドバイスに従い、クロスプラットフォームのシリアライザーを使用してください。個人的には、たまたま@Marcによって書かれたprotobuf-netをお勧めします。

任意のファイル形式から読み込む場合

classと同様に、構造体には複数のパラメーターを受け入れるコンストラクターを含めることができます。実際、一般的にはstructにセッターを提供しない方が賢明です。そうすることで、構築後に構造体の値を変更することができます。これは、多くの開発者が構造体が値のセマンティクスを持つ値型であるという事実を理解していないため、一般的にプログラミングのバグにつながります。

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)
    {
    }
}

可変構造体 (初期化後に変更できる構造体) の危険性をさらに掘り下げるには、

なぜ変更可能な構造体は「悪」なのですか?

于 2012-08-10T21:16:05.300 に答える