THE PUTXI PROJECT

Catalonia is Not Spain

C#

Paradigm: structured, imperative, object-oriented
Appeared in: 2001 (last revised 2005)
Designed by: Microsoft Corporation
Typing discipline: static, strong, both safe and unsafe, nominative
Major implementations: .NET Framework, Mono, DotGNU
Dialects: 1.0, 1.5 , 2.0 (ECMA)
Influenced by: Delphi, C++, Java, Eiffel
Influenced: Nemerle, D, Java[1]
 

C# (C SHARP) is an object-oriented programming language developed by Microsoft as part of their .NET initiative, and later approved as a standard by ECMA and ISO. C# has a procedural, object-oriented syntax based on C++ that includes aspects of several other programming languages (most notably Delphi and Java) with a particular emphasis on simplification (fewer symbolic requirements than C++, fewer declarative requirements than Java[citation needed]).

This article describes the language as defined in the ECMA and ISO standards, and avoids description of Microsoft’s implementation. For a description of Microsoft’s implementation, see Microsoft Visual C#.

Contents

  • 1 Language design goals
  • 2 Architectural history
  • 3 Language features
    • 3.1 Unified type system
    • 3.2 C# 2.0 new language features
    • 3.3 C# 3.0 new language features
    • 3.4 Preprocessor
    • 3.5 XML Documentation System
  • 4 Code libraries
  • 5 Hello world example
  • 6 Standardization
  • 7 Implementations
  • 8 Language name
  • 9 See also
  • 10 External links
  • 11 References

Language design goals

The ECMA standard lists these design goals for C#:

  • C# is intended to be a simple, modern, general-purpose, object-oriented programming language.
  • The language, and implementations thereof, should provide support for software engineering principles such as strong type checking, array bounds checking, detection of attempts to use uninitialized variables, and automatic garbage collection. Software robustness, durability, and programmer productivity are important.
  • The language is intended for use in developing software components suitable for deployment in distributed environments.
  • Source code portability is very important, as is programmer portability, especially for those programmers already familiar with C and C++.
  • Support for internationalization is very important.
  • C# is intended to be suitable for writing applications for both hosted and embedded systems, ranging from the very large that use sophisticated operating systems, down to the very small having dedicated functions.
  • Although C# applications are intended to be economical with regards to memory and processing power requirements, the language was not intended to compete directly on performance and size with C or assembly language.

Architectural history

C#’s principal designer and lead architect at Microsoft is Anders Hejlsberg. His previous experience in programming language and framework design (Visual J++, Borland Delphi, Turbo Pascal) can be readily seen in the syntax of the C# language, as well as throughout the Common Language Runtime (CLR) core. In interviews and technical papers he has stated flaws in most major programming languages, C++, Java, Delphi, Smalltalk, drove the fundamentals of the CLR, which, in turn, drove the design of the C# programming language itself. Some argue that C# shares roots in other languages, as purported by the programming language history chart.

Language features

C# is, in some senses, the programming language which most directly reflects the underlying Common Language Infrastructure (CLI). It was designed specifically to take advantage of the features that the CLI provides. Most of C#’s intrinsic types correspond to value-types implemented by the CLI framework. However, the C# language specification does not state the code generation requirements of the compiler: that is, it does not state that a C# compiler must target a Common Language Runtime (CLR), or generate Common Intermediate Language (CIL), or generate any other specific format. Theoretically, a C# compiler could generate machine code like traditional compilers of C++ or FORTRAN. In practice, all existing C# implementations target CLI.

Compared to C and C++, the language is restricted or enhanced in a number of ways, including but not limited to the following:

  • There are no global variables. All methods and members must be declared as part of a class.
  • Local variables cannot shadow variables of the enclosing block, unlike C and C++. This is often treated as a potential cause of confusion and ambiguity in C++ texts, but C# simply disallows this case.
  • Instead of functions being visible globally, such as the printf() function in C, all functions must be declared in classes.
  • C# supports a boolean type, bool. Statements that take conditions, such as while and if, require an expression of a boolean type. While C99 and C++ do have a boolean type, it can be freely converted to and from integers, and expressions such as if(a) require only that a is convertible to bool, allowing a to be an int, or a pointer. C# disallows this ‘integer meaning true or false’ approach on the grounds that forcing programmers to use expressions that return exactly bool helps prevent certain types of programming mistakes.
  • Support for pointers with safety measures. Pointers can only be used within blocks specifically marked as unsafe, and programs with unsafe code in it need appropriate permissions to run. Most object access is done through safe references, which cannot be made invalid. An unsafe pointer can point to instance of a value-type, array, string, or a block of memory allocated on a stack. Code which is not marked as unsafe can still store and manipulate pointers through the System.IntPtr type, but cannot dereference them.
  • Managed memory cannot be explicitly freed, but is instead automatically garbage collected. Garbage collection addresses a common programming mistake of allocating memory and not releasing it, known as a memory leak. C# also provides direct support for deterministic finalization with the using statement (supporting the Resource Acquisition Is Initialization idiom).
  • Multiple inheritance is not supported, although a class can implement any number of interfaces. This was a design decision by the language’s lead architect (Anders Hejlsberg) to avoid complication, avoid “dependency hell,” and simplify architectural requirements throughout CLI.
  • 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. This is enforced at compile-time, during JIT, and, in some dynamic cases, at runtime. There are no implicit conversions between booleans and integers and between enumeration members and integers, and any user-defined conversion must be explicitly marked as explicit or implicit, unlike C++ copy constructors (which are implicit by default) and conversion operators (which are always implicit).
  • Enumeration members are placed in their own namespace.
  • Accessors called properties can be used to modify an object with syntax that resembles C++ member field access. In C++, declaring a member public enables both reading and writing to that member, and accessor methods must be used if more fine-grained control is needed. In C#, properties allow control over member access and data validation.
  • Full type reflection and discovery is available.

Unified type system

C# has a unified type system. This means that all types, including primitives such as integers, are subclasses of the System.Object class. For example, every type inherits a ToString() method. For performance reasons, primitive types (and value types in general) are internally allocated on the stack. Boxing and unboxing allow one to translate primitive data to and from their object form. Effectively, this makes the primitive types a subtype of the Object type. Primitive types can also define methods (e.g., 42.ToString() calls the ToString() method on an integer), and in the programmer’s perspective behave like any other object.

C# allows the programmer to create user-defined value types, using the struct keyword. From the programmer’s perspective, they can be seen as lightweight classes. Unlike regular classes, and like the standard primitives, such value types are allocated on the stack rather than on the heap. They can also be part of an object (either as a field or boxed), or stored in an array, without the memory indirection that normally exists for class types. Structs also come with a number of limitations. Because structs have no notion of a null value and can be used in arrays without initialization, they always come with an implicit default constructor that essentially fills the struct memory space with zeroes. The programmer can only define additional constructors with one or more arguments. This also means that structs lack a virtual method table, and because of that (and the fixed memory footprint), they cannot allow inheritance (but can implement interfaces).

C# 2.0 new language features

New features in C# for the .NET SDK 2.0 (corresponding to the 3rd edition of the ECMA ECMA-334 standard) are:

  • Partial classes allow class implementation across more than one file. This permits breaking down very large classes, or is useful if some parts of a class are automatically generated.

file1.cs:

   public partial class MyClass
   {
       public MyClass()
       {
           // implementation
       }
   }

file2.cs:

   public partial class MyClass
   {
       public SomeMethod()
       {
           // implementation
       }
   }
  • Generics or parameterized types. This is a .NET 2.0 feature supported by C#. Unlike C++ templates, .NET parameterized types are instantiated at runtime rather than by the compiler; hence they can be cross-language whereas C++ templates cannot. They support some features not supported directly by C++ templates such as type constraints on generic parameters by use of interfaces. On the other hand, C# does not support non-type generic parameters. Unlike generics in Java, .NET generics use reification to make parameterized types first-class objects in the CLI Virtual Machine, which allows for optimizations and preservation of the type information.
  • Static classes that cannot be instantiated, and only allow static members. This is similar to the concept of module in many procedural languages.
  • A new form of iterators that employ coroutines via a functional-style yield keyword similar to yield in Python or Ruby.
  • Anonymous methods providing closure functionality.
Example for an anonymous method

public void Method(object parameter)
{
    // ...

    ThreadPool.QueueUserWorkItem(delegate
    {
        if (parameter == ...) // anonymous method has access to parameters from enclosing method.
        {
            // ...

        }

        // ...
    });
}
string status = string.Empty;
public string Status
{
    get { return status; }             // anyone can get value of this property,
    protected set { status = value; }  // but only derived classes can change it
}
  • Nullable value types (denoted by a question mark, ie int? i = null;) which add null to the set of allowed values for any value type. This provides improved interaction with SQL databases, which can have nullable columns of types corresponding to C# primitive types: an SQL INTEGER NULL column type directly translates to the C# int?.

Nullable types received an eleventh hour improvement at the end of August 2005, mere weeks before the official launch, to improve their boxing characteristics: a nullable variable which is assigned null is not actually a null reference, but rather an instance of struct Nullable<T> with property HasValue equal to false. When boxed, the Nullable instance itself was boxed, and not the value stored in it, so the resulting reference would always be non-null, even for null values. The following code illustrates the flaw:

int? i = null;
object o = i;
if (o == null)
  Console.WriteLine("Correct behaviour - you are running a version from Sept 05 or later");
else
  Console.WriteLine("Incorrect behaviour, prior to Sept 05 releases");

This was changed so that the value stored in Nullable is always boxed, so that null values always produce null references. The late nature of this fix caused some controversy, since it required core-CLR changes affecting not only .NET2, but all dependent technologies (including C#, VB, SQL Server 2005 and Visual Studio 2005).

  • Coalesce operator: (??) returns the first of its operands which is not null:
object nullObj = null;
object obj = new Object();
return nullObj ?? obj; //returns obj

The primary use of this operator is to assign a nullable type to a non-nullable type with an easy syntax:

int? i = null;
int j = i ?? 0; // if i was null, initialize j with 0

C# 3.0 new language features

C# 3.0 is the next version of the language as proposed by Microsoft. It includes new features inspired by functional programming languages such as Haskell and ML, and is driven largely by the introduction of the Language Integrated Query (LINQ) pattern to the Common Language Runtime.[2]

  • Language Integrated Query:[3]from, where, select” context-sensitive keywords allowing queries across SQL, XML, collections, and more. These are treated as keywords in the LINQ context, but their addition won’t break existing variables named from, where, or select.
  • Object initialization: Customer c = new Customer(); c.Name = "James"; can be written Customer c = new Customer { Name="James" };
  • Collection initialization: MyList list = new MyList(); list.Add(1); list.Add(2); can be written as MyList list = new MyList { 1, 2 }; (assuming that MyList implements System.Collections.IEnumerable and has a public Add method[4])
  • Local variable type inference: var x = "hello"; is interchangeable with string x = "hello";. Aside from allowing this syntactic sugar, it’s required to allow the declaration of anonymously-typed variables because the true name of the type is known only to the compiler at compile time.
  • Implicitly-typed arrays: The type of an array can now be omitted, so that int[] arr = new int[] { 1, 2, 3 } can now be written as var arr = new[] { 1, 2, 3 }.
  • Lambda expressions: listOfFoo.Where(delegate(Foo x) { return x.size > 10; }) can be written listOfFoo.Where(x => x.size > 10);
  • Compiler-inferred translation of Lambda expressions to either strongly-typed function delegates or strongly-typed expression trees
  • Anonymous types: var x = new { Name = "James" }
  • Extension methods (adding methods to classes by including the this keyword in the first parameter of a method on another static class):
public static class IntExtensions
{
    public static void PrintPlusOne(this int x) { Console.WriteLine(x + 1); }
}
int foo = 0;
foo.PrintPlusOne();

C# 3.0 was unveiled at the 2005 Professional Developers Conference. A preview with specifications is available from the Visual C# site at Microsoft. It is not currently standardized by any standards organisation, though it is expected that it will eventually become an ECMA and then ISO standard, as did its predecessors.

Microsoft has emphasized that the new language features of C# 3.0 will be available without any changes to the runtime. This means that C# 2.0 and 3.0 will be binary-compatible (CLI implementations compatible with 2.0 are able to run 3.0 applications directly).

Although the new features may only slightly change simple in-memory queries, such as List.FindAll or List.RemoveAll, the pattern used by LINQ allows for significant extension points to enable queries over different forms of data, both local and remote.

Preprocessor

C# features what are called preprocessor directives[5] (though it does not have an actual preprocessor) based on the C preprocessor that allows programmers to define symbols but not macros. Conditionals such as #if, #elif, and #else are also provided. Directives such as #region give hints to editors for code folding.

XML Documentation System

C#’s documentation system is similar to Java’s Javadoc, but based on XML. Multiline comments beginning with /** and single line comments beginning with /// are treated as documentation.

public class DocumentedClass
{
    /// <summary>A summary of the method.</summary>
    /// <param name="firstParam">A description of the parameter.</param>
    /// <remarks>Remarks about the method.</remarks>
    public static void ExampleMethod(int firstParam) { }
}

Syntax for documentation comments and their XML markup is defined in a non-normative annex of the ECMA C# standard. The same standard also defines rules for processing of such comments, and their transformation to a plain XML document with precise rules for mapping of CLI identifiers to their related documentation elements. This allows any C# IDE or other development tool to find documentation for any symbol in the code in a certain well-defined way.

Code libraries

The C# specification details a minimum set of types and class libraries that the compiler expects to have available and they define the basics required. In practice, C# is most often used with some implementation of the Common Language Infrastructure (CLI), which is standardized as ECMA-335 Common Language Infrastructure (CLI).

Hello world example

The following is a very simple C# program, a version of the classic “Hello world” example:

class ExampleClass
{
    static void Main()
    {
        System.Console.WriteLine("Hello, world!");
    }
}

The effect is to write the text Hello, world! to the output console. Each line serves a specific purpose, as follows:

class ExampleClass

This is a class definition. All the information between the following braces describes this class.

static void Main()

This is the entry point where the program begins execution. It could be called from other code using the syntax ExampleClass.Main(). (The static void portion is a subject for a slightly more advanced discussion.)

System.Console.WriteLine("Hello, world!");

This line performs the actual task of writing the output. Console is a static class within the System namespace, representing a command-line console where a program can input and output text. The program calls the Console method WriteLine, which causes the string passed to it to be displayed on the

Standardization

In August, 2000, Microsoft Corporation, Hewlett-Packard and Intel Corporation co-sponsored the submission of specifications for C# as well as the Common Language Infrastructure (CLI) to the international standardization organization ECMA. In December 2001, ECMA released ECMA-334 C# Language Specification. C# became an ISO standard in 2003 (ISO/IEC 23270). ECMA had previously adopted equivalent specifications as the 2nd edition of C#, in December, 2002.

In June 2005, ECMA approved edition 3 of the C# specification, and updated ECMA-334. Additions included partial classes, anonymous methods, nullable types, and generics (similar to C++ templates).

In July 2005, ECMA submitted the standards and related TRs to ISO/IEC JTC 1 via the latter’s Fast-Track process. This process usually takes 6-9 months.

Implementations

The de facto standard implementation of the C# language is Microsoft C# compiler, included in every installation of .NET Framework. It is used by multiple IDEs: Microsoft’s own Visual C# and Visual C# Express Edition, Borland C# Builder, and open-source SharpDevelop.

Alternative C# compilers are:

  • The Mono project provides a C# compiler, an implementation of the Common Language Infrastructure, and mostly compatible implementations of some of Microsoft proprietary .NET class libraries.
  • The Dot GNU project also provides a C# compiler, an implementation of the Common Language Infrastructure, and mostly compatible implementations of some of Microsoft proprietary .NET class libraries.

Language name

According to the ECMA-334 C# Language Specification, section 6, Acronyms and abbreviations[6] the name of the language is written “C#” (“LATIN CAPITAL LETTER C (U+0043) followed by the NUMBER SIGN # (U+0023)”) and pronounced “C Sharp”.

 

C sharp musical note

 

C sharp musical note

Due to technical limitations of display (fonts, browsers, etc.) and the fact that the sharp symbol (, U+266F, MUSIC SHARP SIGN, see graphic at right if the symbol is not visible) is not present on the standard keyboard, the number sign (#) was chosen to represent the sharp symbol in the written name of the language. So, although the symbol in “C#” represents the sharp symbol, it is actually the number sign (“#”). Although Microsoft’s C# FAQ refers to the sharp symbol in the language name,[7] Microsoft clarifies the language name as follows:

The spoken name of the language is “C sharp” in reference to the musical “sharp” sign, which increases a tone denoted by a letter (between A and G) by half a tone. However, for ease of typing it was decided to represent the sharp sign by a pound symbol[8] (which is on any keyboard) rather than the “musically correct” Unicode sharp sign. The Microsoft and ECMA 334 representation symbols thus agree: the # in C# is the pound sign, but it represents a sharp sign. Think of it in the same way as the <= glyph in C languages which is a less than sign and an equals sign, but represents a less-than-or-equals sign. – Microsoft Online Customer Service[9]

The choice to represent the sharp symbol (♯) with the number sign (#) has led to confusion regarding the name of the language. For example, although most printed literature uses the correct number sign,[10] some incorrectly uses the sharp symbol.[11]

The “sharp” suffix has been used by a number of other .NET languages that are variants of existing languages, including J# (Microsoft’s implementation of Java), A# (from Ada), and F# (presumably from System F, the type system used by the ML family). The original implementation of Eiffel for .NET was called Eiffel#, a name since retired since the full Eiffel language is now supported. The suffix is also sometimes used for libraries, such as Gtk# (a .NET wrapper for GTK+ and other GNOME libraries) and Cocoa# (a wrapper for Cocoa).

Remember: CATALONIA IS NOT SPAIN!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: