Usually a conventional programmer considers the matter of data composition through the prism of the object-oriented paradigm.
Everyone usually intuitively understands that primitive data types are basic, built-in types supported by a compiler or library: int64
, string
, bigint
(although if viewed with a rigor, string
may be considered as char
array, and bigint
as a record).
The next thing programmers learn is that instances of primitive types can be aggregated into collections such as arrays or lists. However, these collections are monomorphic. That is, the type of all collection members must be the same. Pretty limiting, huh?
The object-oriented paradigm extends primitive types with classes. The class just represents a custom type that hides the details of the data composition with the help of encapsulation and offers visibility to just the public properties. Typically, .NET libraries offer plenty of such composite types, for example, System.DateTime...