4.2 Reference Types
A reference type is a class type, an interface type, an array type, or a delegate type.
reference-type: class-type interface-type array-type delegate-type class-type: type-name object dynamic string interface-type: type-name array-type: non-array-type rank-specifiers non-array-type: type rank-specifiers: rank-specifier rank-specifiers rank-specifier rank-specifier: [ dim-separatorsopt ] dim-separators: , dim-separators , delegate-type: type-name
A reference type value is a reference to an instance of the type, the latter known as an object. The special value null is compatible with all reference types and indicates the absence of an instance.
4.2.1 Class Types
A class type defines a data structure that contains data members (constants and fields), function members (methods, properties, events, indexers, operators, instance constructors, destructors, and static constructors), and nested types. Class types support inheritance, a mechanism whereby derived classes can extend and specialize base classes. Instances of class types are created using object-creation-expressions (§7.6.10.1).
Class types are described in §10.
Certain predefined class types have special meaning in the C# language, as described in the table below.
Class Type |
Description |
System.Object |
The ultimate base class of all other types. (See §4.2.2.) |
System.String |
The string type of the C# language. (See §4.2.3.) |
System.ValueType |
The base class of all value types. (See §4.1.1.) |
System.Enum |
The base class of all enum types. (See §14.) |
System.Array |
The base class of all array types. (See §12.) |
System.Delegate |
The base class of all delegate types. (See §15.) |
System.Exception |
The base class of all exception types. (See §16.) |
4.2.2 The object Type
The object class type is the ultimate base class of all other types. Every type in C# directly or indirectly derives from the object class type.
The keyword object is simply an alias for the predefined class System.Object.
4.2.3 The dynamic Type
The dynamic type, like object, can reference any object. When operators are applied to expressions of type dynamic, their resolution is deferred until the program is run. Thus, if the operator cannot legally be applied to the referenced object, no error is given during compilation. Instead, an exception will be thrown when resolution of the operator fails at runtime.
The dynamic type is further described in §4.7, and dynamic binding in §7.2.2.
4.2.4 The string Type
The string type is a sealed class type that inherits directly from object. Instances of the string class represent Unicode character strings.
Values of the string type can be written as string literals (§2.4.4.5).
The keyword string is simply an alias for the predefined class System.String.
4.2.5 Interface Types
An interface defines a contract. A class or struct that implements an interface must adhere to its contract. An interface may inherit from multiple base interfaces, and a class or struct may implement multiple interfaces.
Interface types are described in §13.
4.2.6 Array Types
An array is a data structure that contains zero or more variables that are accessed through computed indices. The variables contained in an array, also called the elements of the array, are all of the same type, and this type is called the element type of the array.
Array types are described in §12.
4.2.7 Delegate Types
A delegate is a data structure that refers to one or more methods. For instance methods, it also refers to their corresponding object instances.
The closest equivalent of a delegate in C or C++ is a function pointer, but whereas a function pointer can reference only static functions, a delegate can reference both static and instance methods. In the latter case, the delegate stores not only a reference to the method’s entry point, but also a reference to the object instance on which to invoke the method.
Delegate types are described in §15.