[C#] C言語との違い (enum、struct、union)

C言語ではよくお世話になる列挙体enumと構造体structはC#にもある。
一方,unionは言語仕様としてはなくなっており、structの特殊な形としておなじような効果を得る仕組みがある。

enum

C#の特徴はenum の各メンバーのデータ型をInt32ではなく Byteなどに明示的に指定できること。

enum Myenum : byte
{
   // 以下に内容定義
    BLUE = 1,
   RED = 5,
   WHITE = 20,
   //....

のようにできる。
struct
structは、C#ではclassの定義と同じようにメンバーとそれを操作するmethodを定義できる。constructorを自分で定義でき, new でオブジェクトを生成できるなど”light-weight class”の気分で使える。
classとの大きな違いはstructを元にした派生クラスが宣言できないこと。classで言うところのsealedになっている。

union
unionという予約語はなくなっている。
たとえば、パケット内のデータを構造体としてアクセスするような場合は属性
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]

[System.Runtime.InteropServices.FieldOffset(値)]
をstructに対して指定することでメモリレイアウトを決め打ちできる。これによってほぼ同等な効果を得ることができる。どのメンバーがどこから始まるのかを指定することでメモリ上で重複するように指定し、union同等の効果を得る。

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct IntandDouble
{
    [System.Runtime.InteropServices.FieldOffset(0)]
    public int i;
    [System.Runtime.InteropServices.FieldOffset(0)]
    public short s1;
    [System.Runtime.InteropServices.FieldOffset(2)]
    public short s2;
}

例は以下のMSDNのドキュメントにもある。
How to: Create a C/C++ Union Using Attributes (C# Programming Guide)

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。