サーチ…


備考

通常、 structは、パフォーマンスが非常に重要な場合にのみ使用されます。値型はスタック上に存在するため、クラスよりもはるかに高速にアクセスできます。ただし、スタックは、ヒープよりもはるかに少ない部屋を持っているので、構造体は小さく維持されなければならない(Microsoftが推奨していますstruct sがこれ以上16以下のバイトを取ります)。

classはC#でもっとも使用されている型(これらの3つのclass )で、一般的には最初に行うべきことです。

enumは、(コンパイル時に)一度だけ定義する必要がある、明確に定義された別個の項目リストを持つことができるときはいつでも使用されます。列挙型は、いくつかの値に軽量参照としてプログラマに役立ちます。代わりのリスト定義のconstantと比較する変数を、あなたは列挙型を使用して、あなたは間違った値を使用していないことを確認するインテリセンスサポートを受けることができます。

構造定義

StructsはSystem.ValueTypeから継承し、値の型であり、スタックに存在します。値型がパラメータとして渡されると、値渡しされます。

Struct MyStruct
{
    public int x;
    public int y;
}

値渡しとは、メソッドのパラメーターの値がメソッドのためにコピーされ、メソッドのパラメーターに加えられた変更がメソッドの外部に反映されないことを意味します。たとえば、 AddNumbersという名前のメソッドを呼び出し、Value型のint型の変数abを渡す次のコードを考えます。

int a = 5;
int b = 6;

AddNumbers(a,b);

public AddNumbers(int x, int y)
{
    int z = x + y; // z becomes 11
    x = x + 5; // now we changed x to be 10
    z = x + y; // now z becomes 16
} 

我々は5を追加したにもかかわらずxメソッド内の値それは値型なので、変更されないまま、それは意味しa xコピーだったの値ではなく、実際に。 a a

Value型はスタック上に存在し、値渡しであることを覚えておいてください。

クラス定義

クラスはSystem.Objectから継承し、参照型であり、ヒープ上に存在します。参照型をパラメータとして渡すと、参照型が渡されます。

public Class MyClass
{
    public int a;
    public int b;
}

渡された参照は、パラメータへの参照がメソッドに渡され、参照がメモリ内のまったく同じオブジェクトに対して行われるため、パラメータの変更がメソッドの外部に反映されることを意味します。以前と同じ例を使ってみましょう。しかし、最初にクラス内のint "ラップ"します。

MyClass instanceOfMyClass = new MyClass();
instanceOfMyClass.a = 5;
instanceOfMyClass.b = 6;

AddNumbers(instanceOfMyClass);

public AddNumbers(MyClass sample)
{
    int z = sample.a + sample.b; // z becomes 11
    sample.a = sample.a + 5; // now we changed a to be 10
    z = sample.a + sample.b; // now z becomes 16
} 

今回は、 sample.a10に変更したときにinstanceOfMyClass.aの値変更されました 。参照渡しとは、オブジェクト自体のコピーではなく、オブジェクトへの参照ポインタとも呼ばれる)がメソッドに渡されたことを意味します。

参照型はヒープ上にあり、参照渡しであることを覚えておいてください。

列挙型の定義

列挙型は特別な型のクラスです。 enumキーワードは、このクラスが抽象System.Enumクラスから継承することをコンパイラに通知します。 Enumは項目の別個のリストに使用されます。

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

列挙型を定数をある基本値にマッピングする便利な方法と考えることができます。上記で定義された列挙型は、曜日ごとに値を宣言し、で始まる1Tuesdayは自動的に2Wednesday 3などにマップされます。

デフォルトでは、enumは基になる型としてintを使用し、0から開始しますがbyte, sbyte, short, ushort, int, uint, long, or ulong 整数型を使用できます。項目。一部の項目が明示的に指定されていても、明示的に指定されていない項目がある場合、最後に定義された項目の後ろの各項目は1だけインクリメントされます。

私たちはこのように、 MyEnumに他の値をキャストして使用します:

MyEnum instance = (MyEnum)3; // the variable named 'instance' gets a 
                             //value of MyEnum.Wednesday, which maps to 3.

int x = 2;
instance = (MyEnum)x; // now 'instance' has a value of MyEnum.Tuesday

もう一つの便利な、より複雑な型の列挙型は、 Flagsと呼ばれFlags 。列挙型飾ることでFlags属性を、一度に、変数に複数の値を割り当てることができます。これを行うときは、基数2の表現で明示的に値を定義する必要があることに注意してください。

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

ビットごとの比較を使用するか、.NET 4.0以降を使用している場合は、組み込みのEnum.HasFlagメソッドを使用して、一度に複数の値を比較できます。

MyEnum instance = MyEnum.Monday | MyEnum.Thursday; // instance now has a value of
                                                   // *both* Monday and Thursday,
                                                   // represented by (in binary) 0100. 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // it doesn't, so this block is skipped
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // it does, so this block is executed
}

EnumクラスはSystem.ValueTypeからサブクラス化されているため、値型として扱われ、参照渡しではなく値渡しされます。ヒープ上にベースオブジェクトが作成されますが、enum値を関数呼び出しに渡すと、Enumの基本値型(通常はSystem.Int32)を使用する値のコピーがスタックにプッシュされます。コンパイラは、この値とスタック上に作成された基本オブジェクトとの関連付けを追跡します。詳細については、 ValueTypeクラス(システム)(MSDN)を参照してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow