1

C#でクラスのサイズを確認する方法はありますか?

私が尋ねる理由は次のとおりです。

クラスのデータをファイルに格納するルーチンと、同じファイルからこのオブジェクト(クラス)をロードする別のルーチンがあります。各属性は特定の順序で格納されます。このクラスを変更する場合は、これらのエクスポート/インポートルーチンを変更する必要があることを忘れないでください。

C ++の例(これがいかに不器用または悪いプログラミングであっても)は次のようになります。

#define PERSON_CLASS_SIZE 8
class Person
{
  char *firstName;
}

..。

bool ExportPerson(Person p)
{
  if (sizeof(Person) != PERSON_CLASS_SIZE ) 
  {  
     CatastrophicAlert("You have changed the Person class and not fixed this export routine!")
  }
}

したがって、コンパイル時の前に、Personのサイズを知って、それに応じてこのサイズでエクスポート/インポートルーチンを変更する必要があります。

C#でこれと同様のことを行う方法はありますか、または別の開発者がクラスを変更した場合にインポート/エクスポートルーチンを変更することを「確認」する他の方法はありますか。

...明らかな「クラスでこれにコメントするだけで、これは開発者が物事を台無しにしないことを保証します」-答え。

前もって感謝します。

4

2 に答える 2

3

各属性は特定の順序で格納されます。このクラスを変更する場合は、これらのエクスポート/インポートルーチンを変更する必要があることを忘れないでください。

独自のシリアル化メカニズムを作成しているようです。その場合は、予想されるプロパティのある種の「フィンガープリント」を正しい順序で含め、読み取り時にそれを検証する必要があります。次に、現在のフィンガープリントを単体テストに含めることができます。これは、プロパティが追加されると失敗します。その後、適切なアクション(既存のデータの移行など)を実行して、単体テストを更新できます。

クラスのサイズをチェックするだけでは、すべてのエラーが見つかるわけではありません。同じ変更で1つのプロパティを追加し、同じサイズの1つを削除すると、気付かないうちにデータが破損する可能性があります。

于 2012-09-14T15:24:58.733 に答える
1

おそらくあなたが必要とするものを達成するための最良の方法ではないという事実の一部として、私は最も速い方法はセシルを使用することだと思います。クラス全体のIL本体を取得できます。

于 2012-09-14T15:31:15.387 に答える