__value
Visual Studio .NET 2003
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. For more information, see 5 __value Classes.
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
#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
return 0;
}