| Safety
		Question: Explain why C# is a safe language. Which kinds of
		programming errors or other dangerous effects are prevented by C# and the CLR?
	 
		Answer: C# and .NET promote code safety in several ways:
	 
		The compiler performs strict type checking in assignments, expressions,
			and method calls. It makes sure that variables always hold values of
			the correct types, that operands of expressions are type compatible with
			each other, and that methods are called with the correct number of
			parameters that have the correct types.
 
 C# does not allow pointer arithmetic or type casts between pointers
			and other data types (except in code that is explicitly marked
			as unsafe). This makes sure that pointers always point to
			a legal object or have the value null.
 
 The CLR throws exceptions if an array is accessed with an invalid
			index, if a null-valued variable is dereferenced, or
			if a type cast is applied to an object that does not have the expected
			target type.
 
 The garbage collector automatically reclaims objects that
			are not referenced any more. This avoids stale pointers
			and memory leaks.
 
 The versioning of .NET assemblies makes sure that the correct versions
			of DLLs are loaded, i.e. those versions that the compiler saw during
			type checking. This guarantees that the type checks of the compiler
			still hold at run time. |