Zum Inhalt springen

Sprachelemente von C-Sharp

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 6. September 2003 um 18:36 Uhr durch Nephelin (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.


C# ist eine objektorientierte Programmiersprache, die vom Softwarehersteller Microsoft im Rahmen seiner .NET-Initiative eingeführt wurde. Die Syntax von C# ist an die ebenfalls objektorientierte und plattformunabhängige Programmiersprache Java angelehnt. Bei der Entwicklung von C# war Anders Hejlsberg maßgeblich beteiligt, der schon für den Softwarehersteller Borland die Programmiersprache Delphi entwickelte, die auf Pascal basiert.

Der Name der Sprache kommt aus der Musik. C# (gesprochen see sharp; engl. für genau erkennen) ist in der Musik die Bezeichnung für den durch ein Kreuz um einen Halbton erhöhten Ton c, das cis. Daher sprechen einige Entwickler anstatt von "C sharp" auch von "cis".

Konzept

Neben Konzepten der Programmiersprache Java, greift C# auch Konzepte aus C++ sowie der Microsoft-eigenen propietären Sprache VisualBasic auf. Beide Programmiersprachen sind ebenfalls, neben weiteren, als eigenständige Portierungen im .NET Framework verfügbar und nutzbar.

Als eine (favorisierte) Sprache der .NET Plattform, wird C# mittels einer virtuellen Laufzeitumgebung (runtime environment) in Form einer virtuellen Maschine (VM) ausgeführt. Durch die Verwendung dieser virtuellen Maschine ist es möglich, ein Programm unabhängig von der Plattform (Betriebssystem, Prozessorarchitektur) auszuführen. Ein Programm, das beispielsweise unter dem Betriebssystem Windows auf einer Intel-Architektur entwickelt wurde, kann somit auch auf einem MacOS X-System auf einer PowerPC (PPC)-Architektur ausgeführt werden. Diese Plattformunabhängigkeit ist bisher aber kaum gegeben, da der Hersteller Microsoft die .NET Plattform nur für seine eigene Produktlinie Windows anbietet. Eine Laufzeitumgebung für das Betriebssystem Linux (und Derivate) steht aber in Form des Mono-Projekts in Aussicht, das vom Hersteller Ximian begonnen wurde. Nur lizenzrechtliche Probleme könnten zum Scheitern dieser Portierung führen.

Was C# von Java und C++ abhebt, ist die Tatsache, dass sowohl Klassen als auch Datentypen, wie in Smalltalk, durch Objekte repräsentiert werden. Ein weiterer Unterschied ist, dass in C# mit Attributen gearbeitet werden kann. Attribute erlauben es, einem Objekt Funktionalität hinzuzufügen, ohne seine Schnittstelle zu verändern. Man spricht hierbei auch von Metadaten.

Einige der Elemente von C++, die im allgemeinen als unsicher gelten, wie beispielsweise Zeiger-Arithmetik, wurden in C# nur für so genannten "unsafe code" (unmanaged code) erlaubt. Dieser benötigt eine veränderte Sicherheitseinstellung, um auf einem Zielsystem ausgeführt zu werden, und einen zusätzlichen Compiler-Schalter, um ihn zu übersetzen. Somit wird vermieden, dass sich versehentlich unsicherer Code in eine Anwendung einschleicht.

Sprachelemente

Zu Beginn der Klassiker aller Programme in C#:

using System;

class HalloWelt
{
    static void Main()
    {
        Console.WriteLine("Hallo Welt");
    }
}

Notationsregeln

Quellcode

Zeichensatz
Unicode

Schlüsselworte

if, else (Bedingte Ausführung)
for, while, do (Schleifen)
continue, break, goto
return, throw (Sprünge)
switch, case (Aufzählung)

Klassen und Objekte

Die Klasse Object
Konstruktor
Destruktor
Das Schlüsselwort static
Das Schlüsselwort new
Das Schlüsselwort this

Strukturen

Zugriffsmodifikatoren

Flags

Datentypen, Eigenschaften und Konstanten

C# kennt zwei Arten von Datentypen: Wertetypen (value types) und Referenztypen (reference types). Referenztypen dürfen dabei nicht mit Zeigern (pointer) gleichgesetzt werden, wie sie u. a. aus der Sprache C/C++ bekannt sind. Diese werden von C# zwar auch unterstützt, aber nur im unsicheren Modus (unsafe mode).

Wertetypen enthalten die Daten direkt, wobei Referenztypen im Gegensatz dazu nur Verweise auf die eigentlichen Daten, oder besser, Objekte darstellen. Bei Lesen und Schreiben von Wertetypen werden die Daten dagegen über einen Automatimus, Boxing genannt, in einer Instanz der jeweiligen Wrapper-Klasse gespeichert oder aus ihr geladen.

Die Zuweisung eines Wertes bzw. einer Referenz kann während der Deklaration erfolgen oder später, sofern die Variable nichts als Konstante deklariert wurde. Die Deklaration erfolgt durch Angabe eines Datentyps gefolgt von einem Variablennamen:

// Datentyp Variable;
int i;
System.Collections.IList liste;

Es können auch mehrere Variablen des gleichen Typs zeitgleich deklariert werden:

// Datentyp Variable1, Variable2, ...;
int i, j, k;
System.Collections.IList liste1, liste2;

Ferner besteht die Möglichkeit, der Variablen bei der Deklaration auch gleich einen Wert oder eine Referenz zuzuweisen (Initialwert):

// Datentyp Variable=Wert/Referenz;
int i = 5;
int j = 2, k = 3;
System.Collections.IList liste = new System.Collections.ArrayList();

Auch die Mehrfachzuweisung eines Wertes an verschiedene Variablen ist möglich:

int i, j, k;
i = j = k = 123;

Einen Sonderfall der Zuweisung stellt die Deklaration von Feldern (Arrays) dar. Näheres hierzu im entsprechenden Abschnitt.

Datentypen und Speicherbedarf

Datentypen sind in C# nicht elementar, sondern objektbasiert. Jeder der in der Tabelle aufgeführten Datentypen stellt einen Alias auf eine Klasse des Namespaces System dar. Beispielsweise wird der Datentyp bool durch die Klasse System.Boolean abgebildet. Man spricht dabei auch von einer Wrapper-Klasse. Durch die Objektbasiertheit ist es möglich, Methoden auf Datentypen anzuwenden, die die entsprechende Wrapper-Klasse bereitstellt:

1234.ToString();

int i = 17;
i.ToString();

Vergleichbar mit C/C++, und anders als bei Java, gibt es unter C# vorzeichenbehaftete und vorzeichenlose Datentypen. Diese werden durch Voranstellen des Buchstaben s (signed) bei vorzeichenbehafteten Datentypen und durch Voranstellen des Buchstaben u (unsigned) bei vorzeichenlosen Datentypen symbolisiert (sbyte, uint, ulong, ushort, mit Ausnahme von short). Die Fließ- bzw- Gleitkomma-Datentypen (float, double, decimal) können neben einfacher auch doppelte Genauigkeit aufweisen und haben einen variierenden Speicherbedarf. Dadurch ändert sich die Genauigkeit, was in der Anzahl der möglichen Nachkommastellen zum Ausdruck kommt.

DatentypBitVorz.Wrapper-Klasse (struct type)
bool1-System.Boolean
byte8JSystem.Byte
char16-System.Char
decimal128-System.Decimal
double64-System.Double
float32-System.Single
int32JSystem.Int32
long64JSystem.Int64
sbyte8JSystem.SByte
short16JSystem.Int16
uint32NSystem.UInt32
ulong64NSystem.UInt64
ushort16NSystem.UInt16
Das Schlüsselwort const

Durch Verwendung des Schlüsselwortes const wird einer Variablen ein konstanter Wert zugewiesen. Einer mit const deklarierten Variable kann nach der Deklaration und Wertzuweisung kein neuer Wert bzw. keine neue Referenz zugewiesen werden. Die Variable wird als unveränderbare Konstante behandelt.

Eine Konstante kann dabei sowohl ein Wertetyp sein (also ein einfacher Datentyp), als auch ein Referenztyp, der auf ein Objekt verweist. Das Schlüsselwort const sichert dabei nur, dass die Referenz nicht veränderbar ist, aber schützt nicht vor Änderungen am referenzierten Objekt. So kann beispielsweise einer Konstanten die Referenz auf eine Liste zugewiesen werden, aber es sind weiterhin Änderungen an der Liste selbst möglich (z. B. das Hinzufügen oder das Löschen von Listenelementen).

using System;
using System.Collections;

public class ConstBeispiel
{
    public static void Main()
    {
        // Neue Konstante erstellen
        const IList liste = new ArrayList();

        // Der Liste zwei Elemente hinzufügen
        liste.Add("Element 1: string");
        liste.Add("Element 2: string");

        // FEHLER: Versuch der Variablen liste
        // eine neue Referenz zuzuweisen
        liste = new ArrayList();

    }
}

Das Schlüsselwort const existiert auch in anderen Sprachen (z. B. C++) oder es existieren vergleichbare Schlüsselworte (z. B. final in der Programmiersprache Java).

Get- und Set-Operator (Eigenschaften)
Die Klasse string
Escape-Sequenzen

Methoden

Parameter
Die Schlüsselworte in, out, ref
Parameterlisten
Rückgabewert

Indexer und Arrays (Felder)

Ereignisse und Delegate

Operatoren

Sichtbarkeit

Namensräume (Namespaces)

Vererbung

Abstrakte Klassen
Interfaces
Das Schlüsselwort override
Das Schlüsselwort base
Das Schlüsselwort sealed
Casting (Konvertierung)
Überladen vs Überschreiben
Mehrfachvererbung

Exception-Handling (Ausnahmen)

Assemblies

Attribute (Metadaten)

Shared Libraries (DLLs)

Kommentare und Dokumentation

[TODO: Freiwillige vor]

Verfügbare Klassenbibliotheken

  • Collection
  • Threads
  • Reflection
  • CodeDOM
  • ADO.NET
  • ASP.NET
  • Windows.Forms
  • ...

Verfügbarkeit (IDEs)

Neben der von Microsoft favorisierten Entwicklungsplattform VisualStudio.NET aus dem eigenen Hause, gibt es inzwischen auch Entwicklungsumgebungen (IDEs) anderer Hersteller für C#: