As has been pointed out, not everything can be a reference. Within an individual component, for example, there must be real data—the numbers, strings, and so on that our programs manipulate to achieve some useful result.
Value types are the abstraction that the CLI component model uses to represent the real data of a program to programmers and tools. Without value types
, components would be nothing but empty shells—without values, not much can be done. All useful computational work eventually boils down to working with values.
Bytes, characters, integers (of all sizes), floating-point numbers, decimal numbers, enumerated values, and booleans are all value types. A value type, by ECMA Specification definition (Partition I, 7.2.1), is “represented as a sequence of bits”—in other words, values are actual data rather than an address to a location that contains data.
An instance of a value type can be used as a field of a type, as a parameter, as a method return value, or as a variable. When allocated as part of an object or within an array, the value lives within the object on the heap. When declared as a variable or used as a parameter, value types live on the stack. When passed as a parameter to a method, by default, a copy, rather than the address, of the value type is created and sent to the recipient of the method; in short, value types are passed by value. Example 3-10 shows a C# declaration from the
Echo component that uses two different kinds of value types. ...