__value
注意
このトピックは、C++ マネージ拡張のバージョン 1 にのみ対応しています。この構文は、バージョン 1 のコードを保守するためだけに使用してください。新しい構文で同等の機能を使用する方法については、「クラスと構造体 (C++ コンポーネント拡張)」を参照してください。
クラスが __value 型であることを宣言します。
__value class-specifier
__value struct-specifier
__nogc array-specifier
__nogc pointer-specifier
解説
__value 型は、__value 型の変数が直接そのデータを含むのに対し、マネージ変数はそのデータをポイントし、データは共通言語ランタイム ヒープに格納される点が、__gc とは異なります。
__value 型には次の条件が適用されます。
__value キーワードをインターフェイスに適用することはできません。
__value 型は任意の数のインターフェイスから継承でき、その他の型または __value 型から継承することはできません。
__value の型は定義上はシールされています。 詳細については、「__sealed」を参照してください。
__value 型は、マネージ型が許可される場所であればどこでも使用できます。
注意
__value キーワードは、__abstract キーワードを使用している場合は使用できません。
__value 型は System::Object のポインターに明示的に接続できます。 これは、ボックス化と呼ばれます。
次のガイドラインは、__nogc 型の中への値型の埋め込みに適用されます。
値型には LayoutSequential または LayoutExplicit が必要です。
値型が gc ポインター メンバーを持つことはできません。
値型がプライベート データ メンバーを持つことはできません。
C++ のマネージ拡張で、C# のクラスおよび構造体と同等になるものは、次のとおりです。
C++ マネージ拡張 |
C# |
詳細情報 |
---|---|---|
__gc 構造体 または __gc クラス |
class |
class キーワード |
__value 構造体 または __value クラス |
struct |
struct キーワード |
使用例
次の例では、__value 型 (V) を宣言し、__value 型の 2 つのインスタンスを操作します。
// keyword__value.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
__value struct V {
int m_i;
};
int main() {
V v1, v2;
v1.m_i = 5;
v2 = v1; // copies all fields of v1 to v2
v2.m_i = 6; // does not affect v1.m_I
}