Where C# Fits In
In one sense, C# can be seen as being the same
thing to programming languages as .NET is to the Windows
environment. Just as Microsoft has been adding more and more
features to Windows and the Windows API over the past decade,
Visual Basic 2009 and C++ have undergone expansion. Although Visual
Basic and C++ have ended up as hugely powerful languages as a
result of this, both languages also suffer from problems due to the
legacies from how they have evolved.
In the case of Visual Basic 6 and earlier versions,
the main strength of the language was the fact that it was simple
to understand and didn’t make many programming tasks easy, largely
hiding the details of the Windows API and the COM component
infrastructure from the developer. The downside to this was that
Visual Basic was never truly object oriented, so that large
applications quickly became disorganized and hard to maintain. As
well, because Visual Basic’s syntax was inherited from early
versions of BASIC (which, in turn, was designed to be intuitively
simple for beginning programmers to understand, rather than to
write large commercial applications), it didn’t really lend itself
to well-structured or object-oriented programs.
C++, on the other hand, has its roots in the ANSI
C++ language definition. It isn’t completely ANSI-compliant for the
simple reason that Microsoft first wrote its C++ compiler before
the ANSI definition had become official, but it comes close.
Unfortunately, this has led to two problems. First, ANSI C++ has
its roots in a decade-old state of technology, and this shows up in
a lack of support for modern concepts (such as Unicode strings and
generating XML documentation) and for some archaic syntax
structures designed for the compilers of yesteryear (such as the
separation of declaration from definition of member functions).
Second, Microsoft has been simultaneously trying to evolve C++ into
a language that is designed for high-performance tasks on Windows,
and in order to achieve that, they’ve been forced to add a huge
number of Microsoft-specific keywords as well as various libraries
to the language. The result is that on Windows, the language has
become a complete mess. Just ask C++ developers how many
definitions for a string they can think of: char*, LPTSTR,
string, CString (MFC version), CString (WTL version), wchar_t*, OLECHAR*, and
so on.
Now enter .NET - a completely new environment that
is going to involve new extensions to both languages. Microsoft has
gotten around this by adding yet more Microsoft-specific keywords
to C++, and by completely revamping Visual Basic into Visual Basic
.NET into Visual Basic 2009, a language that retains some of the
basic VB syntax but that is so different in design that it can be
considered, for all practical purposes, a new language.
It’s in this context that Microsoft has decided to
give developers an alternative - a language designed specifically
for .NET, and designed with a clean slate. Visual C# 2009 is the
result. Officially, Microsoft describes C# as a “simple, modern,
object-oriented, and type-safe programming language derived from C
and C++.” Most independent observers would probably change that to
“derived from C, C++, and Java.” Such descriptions are technically
accurate but do little to convey the beauty or elegance of the
language. Syntactically, C# is very similar to both C++ and Java,
to such an extent that many keywords are the same, and C# also
shares the same block structure with braces ({}) to mark blocks of code, and semicolons to
separate statements. The first impression of a piece of C# code is
that it looks quite like C++ or Java code. Beyond that initial
similarity, however, C# is a lot easier to learn than C++, and of
comparable difficulty to Java.
Its design is more in tune with modern developer tools than both of
those other languages, and it has been designed to provide,
simultaneously, the ease of use of Visual Basic and the
high-performance, low-level memory access of C++, if required. Some
of the features of C# are:
-
Full support for classes and object-oriented
programming, including both interface and implementation
inheritance, virtual functions, and operator overloading.
-
A consistent and well-defined set of basic
types.
-
Built-in support for automatic generation of
XML documentation.
-
Automatic cleanup of dynamically allocated
memory.
-
The facility to mark classes or methods with
user-defined attributes. This can be useful for documentation and
can have some effects on compilation (for example, marking methods
to be compiled only in debug builds).
-
Full access to the .NET base class library,
as well as easy access to the Windows API (if you really need it,
which won’t be all that often).
-
Pointers and direct memory access are
available if required, but the language has been designed in such a
way that you can work without them in almost all cases.
-
Support for properties and events in the
style of Visual Basic.
-
Just by changing the compiler options, you
can compile either to an executable or to a library of .NET
components that can be called up by other code in the same way as
ActiveX controls (COM components).
-
C# can be used to write ASP.NET dynamic Web
pages and XML Web services.
Most of the above statements, it should be pointed
out, do also apply to Visual Basic 2009 and Managed C++. The fact
that C# is designed from the start to work with .NET, however,
means that its support for the features of .NET is both more
complete, and offered within the context of a more suitable syntax
than for those other languages. While the C# language itself is
very similar to Java, there are some improvements, in particular,
Java is not designed to work with the .NET environment.
Before we leave the subject, we should point
out a couple of limitations of C#. The one area the language is not
designed for is time-critical or extremely high performance code -
the kind where you really are worried about whether a loop takes
1,000 or 1,050 machine cycles to run through, and you need to clean
up your resources the millisecond they are no longer needed. C++ is
likely to continue to reign supreme among low-level languages in
this area. C# lacks certain key facilities needed for extremely
high-performance apps, including the ability to specify inline
functions and destructors that are guaranteed to run at particular
points in the code. However, the proportions of applications that
fall into this category are very low.