C# was designed in cooperation with .NET to
Let C and C++ programmers feel familiar with C# C# has many operators, keywords, and concepts in common with C++, which makes it immediately familiar to C++ programmers.
Be simpler, safer and more productive than C++ This is achieved through mechanisms such as garbage collection, structured exception handling, and type safety, and by letting the underlying runtime take care of many other error prone, tedious, and time consuming housekeeping tasks.
Be a true component-oriented language Creating a component is as easy as creating a program, because any program you create is also a component. No other special files are required. This concept is known as one stop programming.
Metadata and attributes allow each component to be self-describing in terms of the functionality it exposes and the resources and other components it needs so, in effect, allows it to easily be slotted into a broad variety of computing environments.
Be a true OO language, such as SmallTalk, where everything is an object The ability in a language to treat every variable as an object has several advantages. SmallTalk supports this paradigm but, unfortunately, with one important drawback slow program execution. Java and C++ do not support this model, perhaps because of this latter problem. However, the C# designers have done some pretty ingenious thinking by allowing the support of "everything is an object" while avoiding the performance compromise found in SmallTalk.
Provide full support for RAD, similar to Visual Basic Constructs, such as properties that are also found in Visual Basic, allows C# to be fully integrated with Visual Studio.NET and its Integrated Development Environment (IDE). This allows C# to fully support RAD.
Be totally integrated with the .NET platform C# was designed from the ground up to interoperate with and leverage all the relevant features of .NET. The result is a seamless integration between C# and .NET.
Interoperate with other languages at the object-oriented level For example, it is now possible to write a class in Visual Basic, derive a class from this Visual Basic class in C++, and then instantiate this C++ class in C#. MSIL and metadata make this level of interoperability possible, as discussed in a previous section.
Interoperate fully with already existing code, such as COM and DLLs By writing wrapper classes, the programmer allows the program to call COM objects. Conversely, you can also allow .NET objects to be used as COM objects. Through a feature called platform invoke, it is possible to call native DLL functions.