クラスは参照タイプであり、構造は値タイプです。
クラスが参照型であると言うと、
基本的にインスタンス変数のアドレスが含まれます。
例えば:
Class MyClass
{
Public Int DataMember; //By default, accessibility of class data members
//will be private. So I am making it as Public which
//can be accessed outside of the class.
}
メインメソッドで
は、このクラスにメモリを割り当て
、そのベースアドレスをMyClassタイプの変数(_myClassObject2)に格納する新しい演算子を使用して、このクラスのインスタンスを作成できます。
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
上記のプログラムでは、MyClass _myClassObject2 = _myClassObject1; 命令は、MyClassタイプの両方の変数が
- myClassObject1
- myClassObject2
同じメモリ位置を指します。
基本的に、同じメモリロケーションを同じタイプの別の変数に割り当てます。
したがって、オブジェクトタイプMyClassのいずれかで行った変更は
、両方が同じメモリロケーションを指しているため、別のオブジェクトに影響を与えます。
「_myClassObject1.DataMember = 10;」この行では、オブジェクトの両方のデータメンバーに値10が含まれます。
"_myClassObject2.DataMember = 20;" この行では、オブジェクトの両方のデータメンバーに値20が含まれます。
最終的に、ポインターを介してオブジェクトのデータメンバーにアクセスします。
クラスとは異なり、構造体は値型です。例えば:
Structure MyStructure
{
Public Int DataMember; //By default, accessibility of Structure data
//members will be private. So I am making it as
//Public which can be accessed out side of the structure.
}
Static Public void Main (string[] arg)
{
MyStructure _myStructObject1 = new MyStructure();
_myStructObject1.DataMember = 10;
MyStructure _myStructObject2 = _myStructObject1;
_myStructObject2.DataMember = 20;
}
上記のプログラムでは、
新しい演算子を使用してMyStructure型のオブジェクトをインスタンス化し、MyStructure型の
_myStructObject変数にアドレスを格納
し、 "_ myStructObject1.DataMember = 10"を使用して構造体のデータメンバーに値10を割り当てます。
次の行では、
MyStructure型の別の変数_myStructObject2を宣言し、それに_myStructObject1を割り当てています。
ここで、.NET C#コンパイラは_myStructureObject1オブジェクトの別のコピーを作成し、
そのメモリ位置をMyStructure変数_myStructObject2に割り当てます。
したがって、_myStructObject1に加えた変更は、MyStructrueタイプの別の変数_myStructObject2に影響を与えることはありません。
そのため、構造体は値型です。
したがって、クラスの直接の基本クラスはオブジェクトであり、構造の直接の基本クラスはオブジェクトから継承するValueTypeです。
クラスは継承をサポートしますが、構造体はサポートしません。
どのように言っているのですか?
そしてその背後にある理由は何ですか?
答えはクラスです。
抽象的、封印済み、静的、部分的であり、プライベート、保護、内部保護はできません。