This documentation is archived and is not being maintained.


Visual Studio .NET 2003

Declares a class to be a __value type.

__value class-specifier
__value struct-specifier
__nogc array-specifier
__nogc pointer-specifier


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


__gc class

class class keyword
__value struct


__value class

struct struct keyword


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;

See Also

Managed Extensions for C++ Reference | C++ Keywords