C# is an object-oriented programming language developed by Microsoft as part of their .NET initiative. Microsoft based C# on C++ and Java. C# was designed as a language that would provide a balance of C++ with rapid development, Visual Basic, Delphi, and Java.
C# is, in some sense, the programming language which most directly reflects the underlying .NET Framework on which all .NET programs run, and it depends strongly on this framework; there is no such thing as an unmanaged C# program. Its primitive datatypes are objects of the corresponding .NET types, it is garbage-collected, and many of its abstractions, such as its classes, interfaces, delegates, exceptions, and so on, expose explicit features of the .NET runtime.
Compared to C and C++, the language is restricted or enhanced in a number of ways, including but not limited to the following:
- C# is tied to the Windows platform (end user must have .Net framework installed). Unofficial support for Linux is provided in the shape of Mono
- The Managed DirectX classes were designed for use in C# and make using DX easy.
- Raw pointers and unchecked arithmetic can only be used in a special unsafe mode. Most object access is done through safe references, which cannot be made invalid, and most arithmetic is checked for overflow.
- Objects cannot be explicitly freed, but instead are garbage collected when no more references to them exist.
- As in Java, only single inheritance is available, but a class can implement any number of abstract interfaces. This functions mainly to simplify the runtime's implementation.
- C# is more typesafe than C++. The only implicit conversions by default are safe conversions, such as widening of integers and conversion from a derived type to a base type. There are no implicit conversions between booleans and integers, between enumeration members and integers, no void pointers (although references to Object are similar), and any user-defined implicit conversion must be explicitly marked as such, unlike C++'s copy constructors.
- Syntax for array declaration is different ("int a = new int" instead of "int a").
- C# has no templates, but C# 2.0 has generics, and these support some features not supported by C++ templates such as type constraints on generic parameters. On the other hand, expressions cannot be used as generic parameters as in C++ templates.
- Full reflection is available.
Although C# is often considered similar to Java, there are also a number of notable differences with this language as well, including the following:
- Java does not have operator overloading.
- Java does not have an unsafe mode permitting native pointer manipulation and unchecked arithmetic.
- Java has checked exceptions, while C# exceptions are unchecked, as in C++.
- C# has a goto control flow construct not found in Java.
- Java uses Javadoc-syntax comments to automatically generate documentation from source files. C# uses XML-based comments for this purpose.
- C# supports checked arithmetic.
- C# supports indexers.
- C# greatly simplifies event-driven programming through language constructs like events and delegates.
- C# supports structures in addition to classes. Structures, known in the .NET Framework as value types, are comparable to C structures, in that they need not be heap-allocated and can limit the number of dereferences needed to access data; see value type.
- C# has a unified object model for value-types and objects (There is no difference between "int" and "System.Int32").
C# is a ECMA and ISO standardized language. There are currently a number of C# implementations. More information can be found here.
C# has only been used for a few roguelikes so far: