C# Learning Notes
This is just learning notes on C# and CLR.
Terminology
CLR: Common Language Runtime.
FCL: Framework Class Library.
CLS: Common Language Specification.
CTS: Common Type System.
Types
Primitive Types
Any data types the compiler directly support are called primitive types. Primitive types map directly to types existing in Framework Class Library.
Type Conversion
C# allows implicit casts if the conversion is “safe”, that is, no loss of data is possible, such as converting an Int32
to Int64
. But C# requires explicit casts if the conversion is potentially unsafe.
Literals
In addition to casting, primitive casts can be written as literals. A literal is considered as an instance of the type itself, and therefore, you can call instance methods on literals.
Reference Type
Reference type instances are always allocated from the managed heap. And not explicitly initialized memory is always set to 0(in the object). And garbage collection works.
By default, when a reference type variable is created, it’s initialized to null
, indicating that reference type variable doesn’t currently point to a valid object. Attempting to null
reference type variable will cause a NullReferenceException
to be thrown.
Value Type
Value type instances are usually allocated on the thread stack (althought they can also be embedded in objects as fields).
Value Type vs Reference Type
- When indicating value types, it’s usually called structures or enumerations. When indicating reference types, it’s usually called classes. (In the documentations)
- Value type objects have two representations: an unboxed form and a boxed form. Reference type objects are always in a boxed form.
- You should be aware that Microsoft’s C# compiler selects
Layout.Auto
for reference types andLayout.Sequential
for value types. It’s obvious that the C# compiler team believes that structures are commonly used when interoperating with unmanaged code.