Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Note
This topic applies only to version 1 of Managed Extensions for C++. This syntax should only be used to maintain version 1 code. See Classes and Structs (Managed) for information on using the equivalent functionality in the new syntax.
Declares a class to be a __value type.
__value class-specifier
__value struct-specifier
__nogc array-specifier
__nogc pointer-specifier
Remarks
A __value type differs from __gc types in that __value type variables directly contain their data, whereas managed variables point to their data, which is stored on the common language runtime heap.
The following conditions apply to __value types:
The __value keyword cannot be applied to an interface.
A __value type can inherit from any number of interfaces and cannot inherit from other types or __value types.
A __value type is sealed by definition. For more information, see __sealed.
It is valid to use a __value type anywhere a managed type is allowed.
Note
The __value keyword is not allowed when used with the __abstract keyword.
A __value type can be explicitly connected to a System::Object pointer. This is known as boxing.
The following guidelines apply to embedding a value type inside a __nogc type:
The value type must have LayoutSequential or LayoutExplicit.
The value type can not have gc pointer members.
The value type can not have private data members.
In Managed Extensions for C++, the equivalents to a C# class and a C# struct are as follows:
Managed Extensions for C++ | C# | For more information |
---|---|---|
__gc struct -or- __gc class |
class |
class keyword |
__value struct -or- __value class |
struct |
struct keyword |
Example
In the following example, a __value type (V
) is declared and then two instances of the __value type are manipulated:
// 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
}