C# is an object-oriented, type-safe and general-purpose programming language, which focuses on making the programmers productive. It tries to achieve this productivity through expressiveness, simplicity and a focus on performance. It works on different platforms such as Windows, Mac, and Linux.
C# is a statically typed language. That means the types are verified when you compile a program. This eliminates a large set of errors before the program even runs.
Automatic memory management is an essential feature of C#. It has a garbage collector that runs along with the programs, reclaiming the unused memory. This frees the burden from programmers to explicitly deallocating memory.
The .NET ecosystem provides support for C# programs through a Common Language Runtime and Base Class Library. It also includes an application layer that provides libraries to build desktop, mobile, or web applications.
Common indicates that the runtime is shared by other languages in the .NET ecosystem, such as C#, Visual Basic, F#, and managed C++. CLR provides garbage collection and exception handling.
C# compiler converts the code into an intermediate language (IL), similar to the byte-code for Java. The CLR then converts this IL into the native code of the machine, such as X-64 or X-86, just before it's executed. This is known as just-in-time (JIT) compilation.
The container for this intermediate language is called an assembly. It contains the information about the types along with the IL code. It allows one assembly to reference another. C# can also query the metadata using reflection.
A set of assemblies is included in the CLR, called the base class library. It provides essential functionality that's required by most of the programs, such as I/O, file/text processing, networking, etc.
It also includes the types that the language needs itself, e.g. collection, linq, and async programming, and lets you access features of CLR such as garbage collection and reflection.