C-Sharp

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von ECMA-334)
C#
C Sharp wordmark.svg
Objektorientierte Programmiersprache
Basisdaten
Paradigmen: multiparadigmatisch: strukturiert, imperativ, deklarativ, objektorientiert, ereignisorientiert, funktional, generisch, reflexiv, parallel
Designer: Anders Hejlsberg
Typisierung: statisch, stark, explizit (optional: dynamisch, duck, implizit)
Wichtige Implementierungen: Visual C#, Mono
Standardisierungen: ECMA-334
Beeinflusste: Java,[1] Vala, , Swift, VB.NET
Betriebssystem: alle, für die eine CLI-Implementierung existiert (z. B. Microsofts .Net-Framework oder Xamarins Mono)
https://docs.microsoft.com/de-de/dotnet/csharp/

C# (englisch c sharp [siːˈʃɑːp]) ist eine typsichere objektorientierte Allzweck-Programmiersprache. Architekt der Sprache war Anders Hejlsberg im Auftrag von Microsoft, zurzeit ist Mads Torgersen der Chef-Entwickler. Die Sprache ist an sich plattformunabhängig, wurde aber im Rahmen der .NET-Strategie entwickelt, ist auf diese optimiert und meist in deren Kontext zu finden.

Historisch wurde in C# fast exklusiv für Windows entwickelt. Durch Xamarin ist es inzwischen aber auch möglich, für macOS, iOS und Android zu entwickeln. Zudem gibt es mit .NET Core auch offizielle Unterstützung für GNU/Linux und macOS.[2]

Bis Version 2 war die Sprache bei der ECMA[3] und der ISO[4] als Standard registriert. In der Folge erschienen regelmäßig umfangreiche Erweiterungen der Sprache durch Microsoft. Durch die Entwicklung des Referenz-Compilers als Open Source (seit 2014) sind auch Community-Beiträge möglich.

Namensgebung

C# wurde unter dem Codenamen Cool entwickelt, der jedoch aus Gründen des Marketings zur Veröffentlichung geändert wurde. Der Name C Sharp leitet sich vom Zeichen Kreuz (, englisch

sharp

) der Notenschrift ab,[5] was dort für eine Erhöhung des Grundtons um einen Halbton steht. C sharp ist also der englische Begriff für den Ton cis. Dies ist eine Anspielung darauf, dass der Name der Programmiersprache C++ der Notation für die Erhöhung des Werts einer Variable um eins entstammt. Des Weiteren kann man das Kreuz-Zeichen als Kombination von vier Plus-Zeichen betrachten, was eine Erhöhung von C++ darstellen soll.[6] Allerdings enthält der Name nicht das Kreuz-Zeichen der Musiknotation, sondern ein Doppelkreuz bzw. Raute,[7] das häufig als Ersatzzeichen für das Kreuz genutzt wird, weil es im Gegensatz zum Kreuz auf üblichen Tastaturen vorkommt.

In künstlerischen Darstellungen wird teilweise auch das Notenschriftzeichen verwendet, was in der Folge von einigen für korrekt gehalten wird.[8] Eindeutig falsch ist die zweifache Verwendung des doppelten Dagger-Zeichens.

Konzept

C# greift Konzepte der Programmiersprachen Java, C++, Haskell, C sowie von Delphi auf. C# zählt zu den objektorientierten Programmiersprachen und unterstützt sowohl die Entwicklung von sprachunabhängigen .NET-Komponenten als auch COM-Komponenten für den Gebrauch mit Win32-Anwendungsprogrammen.

Einige der Elemente von C++, die im Allgemeinen als unsicher gelten, wie beispielsweise Zeiger, werden in C# nur für sogenannten „unsicheren Code“ erlaubt, der in Zonen mit eingeschränkten Rechten (z. B. bei Programmen, die aus Webseiten heraus ausgeführt werden) ohne die Zuteilung erweiterter Rechte nicht ausgeführt wird.

Als .NET-Sprache verfügt auch C# über Sprachunterstützung für Attribute und Delegaten. Attribute erlauben es, Informationen über eine Klasse, ein Objekt, oder eine Methode zu speichern, die zur Laufzeit ausgewertet werden können. Man spricht hierbei auch von Metadaten. Ein Delegat kann auf Methoden einer Klasse verweisen. Das Konzept stellt eine Weiterentwicklung von Funktionszeigern dar, wie sie beispielsweise in der Programmiersprache C vorkommen. Der Delegat hat jedoch einen festen Typ (genannt Delegat-Typ), der eine konkrete Signatur festlegt, die vom Compiler überprüft wird. Für den Aufruf beinhaltet der Delegat auch den Verweis auf das zu den Methoden gehörende Objekt. Ein Aufruf eines Delegaten ruft also gezielt eine Methode auf, der implizit ein Objektzeiger als Parameter übergeben wird. Außerdem müssen Delegaten typensicher deklariert werden, was zur Folge hat, dass Inkompatibilitäten der Methodensignaturen zwischen aufrufendem Delegat und der aufzurufenden Methode schon während der Kompilierung bemerkt werden.

Ab der Version 2.0 von C#, die mit .Net-Framework 2.0 freigegeben wurde, unterstützt C# neben generischen Typen (englisch generics) auch anonyme Methoden, Generatoren und partielle Klassen. Generische Typen, Iteratoren und partielle Klassen sind Bestandteil des .NET-Frameworks 2.0 und stehen somit auch anderen .NET-Programmiersprachen wie beispielsweise Visual Basic .NET zur Verfügung.

Standardisierung

Microsoft reichte C# im August 2000 zusammen mit Hewlett-Packard und Intel bei der Normungsorganisation Ecma International zur Normung ein. Im Dezember 2001 veröffentlichte die ECMA die Norm ECMA-334 C# Language Specification. 2003 wurde C# von der ISO genormt (ISO/IEC 23270).

Im Juni 2005 genehmigte die ECMA die dritte Version (C# 2.0) der C#-Spezifikationen und aktualisierte die bisherige Norm ECMA-334. Hinzu kamen die partiellen Klassen, anonyme Methoden, nullable types und Generics, die Ähnlichkeiten zu den C++-Templates aufweisen. Im Juli 2005 übergab die ECMA die Standards und zugehörigen TRs an die ISO/IEC JTC 1.

Die ECMA-Spezifikation 334 deckt nur die Sprache C# ab. Programme, die in C# geschrieben werden, nutzen gewöhnlich das .NET-Framework, das teilweise durch andere Spezifikationen beschrieben wird und teilweise proprietär ist. Dennoch ist die Sprache C# prinzipiell plattformunabhängig. Das von Ximian (jetzt Xamarin) initiierte Projekt Mono ermöglicht beispielsweise auch Nutzern von macOS oder Unix, C# für Entwicklungen auf ihrem Betriebssystem einzusetzen.

Microsoft veröffentlichte die dritte Version von C# mit dem .NET-SDK 2.0 und Visual Studio 2005 im November 2005.

Microsoft stellte klar, dass C#, genauso wie andere .NET-Sprachen, einen wichtigen Bestandteil seiner Softwarestrategie sowohl für den internen als auch für den externen Gebrauch darstelle. Das Unternehmen übernimmt eine aktive Rolle in der Vermarktung der Sprache als Teil seiner gesamten Geschäftsstrategie.

Versionen

C#-Versionen
Jahr Version neu eingeführte Sprachelemente
.NET C#
2002 .NET 1.0 C# 1.0
2003 .NET 1.1 C# 1.2
2005 .NET 2.0 C# 2.0

Generics
Partielle Typen
Anonyme Methoden
Iteratoren
Nullable-Datentyp
Private setters
Delegates
Kovarianz und Kontravarianz
Statische Klassen

2006 .NET 3.0
2007 .NET 3.5 C# 3.0

Implizit typisierte Variablen
Objekt- und Collection-Initialisierer
Automatisch implementierte Properties
Anonyme Datentypen
Erweiterungsmethoden
LINQ
Lambda-Expressions
Expression-Trees
Partielle Methoden

2010 .NET 4.0 C# 4.0

Dynamisches Binding
Benannte und optionale Argumente
Generische Ko- und Kontravarianz
Embedded Interop-Datentypen („NoPIA“)

2012 .NET 4.5 C# 5.0

Asynchrone Methoden
Caller-Info-Attribute

2015 .NET 4.6 C# 6.0

Initialisierer für Auto-Properties
Import statischer Funktionen in den Namespace
Exception Filters
Indizierte Membervariablen und Elementinitialisierer
Das Keyword await in try-catch-finally Blocks
Collection-Initialisierer verwenden Add()-Erweiterungsmethode
String-Interpolation
Mehrzeilige String-Ausdrücke
Null-Conditional Operator
nameof-Ausdruck
Implementierung von Methoden mittels Lambda-Ausdruck

2017 .NET 4.6.2
.NET Core
C# 7.0..7.3

Deklarationsausdrücke auf out-Parametern
Mustervergleiche (Pattern matching)
is-Ausdrücke mit Mustern
switch-Anweisungen mit Typ-Mustern und zusätzlichen Bedingungen
Tupel
Dekonstruktion von Tupeln
Lokal deklarierte Funktionen
Füllzeichen _ zur Verbesserung der Lesbarkeit von Zahlen
Binärliterale 0b...
Referenzen (Verweise) als Rückgabewert von Funktionen und als lokale Variablen
Verallgemeinerte async-Rückgabe-Typen

Die Main-Methode kann async sein
Lambdaausdrücke => in Konstruktoren, Accessoren(get,set) und Finalizern
Ausnahmen innerhalb von Ausdrücken erzeugen
Bedingte ref-Ausdrücke

2019 .NET Core 3 C#8.0 Standardimplementierungen in Schnittstellen

Switch Expressions

Index- und Range-Operatoren zur Adressierung von Teilmengen

asynchrone Streams (asynchrone Iteration mit foreach)

nullbare Referenztypen (z. B. String?)

statische Lokale Funktionen

2020 .NET 5.0 C#9.0 Datensatztypen (Records)

Eigenschafteninitialisierung

Anweisungen außerhalb von Klassen

Verbesserungen beim Pattern Matching

Ganzzahlen mit nativer Größe

Funktionszeiger

Unterdrücke die Emission der lokalen Flags

Zieltypisierte new-Ausdrücke

statische anonyme Funktionen

Zieltypisierte bedingte Ausdrücke

Kovariante Rückgabetypen

Erweiterungsunterstützung GetEnumeratorfür foreachSchleifen

Lambda-Verwerfungsparameter

Attribute für lokale Funktionen

Modulinitialisierer

Neue Funktionen für Teilmethoden

2022 .NET 6.0 C#10.0

Datensatzstrukturen[9] Parameterlose Strukturkonstruktoren
Globale using-Anweisung
Dateibereichsnamespaces
Muster für erweiterte Eigenschaften
Verbesserte interpolierte Zeichenfolgen
Konstante interpolierte Zeichenfolgen
Lambdaverbesserungen
Aufruferargumentausdruck
Erweiterte #line-Direktiven
Generische Attribute
Verbesserte Analyse der definitiven Zuweisung
AsyncMethodBuilder-Überschreibung

Integrierte Entwicklungsumgebungen (IDEs)

Die dominierende Entwicklungsplattform ist Microsoft Visual Studio (Windows und macOS, proprietäre Software). Es gibt auch eine Reihe anderer Entwicklungsumgebungen (IDEs) für C#, es werden jedoch nicht immer die neusten Sprachstandards und Laufzeitumgebungen (.NET Core) unterstützt:

Compiler

In der Regel übersetzen die C# Compiler nicht unmittelbar in die Maschinensprache, sondern in eine Zwischensprache.

Bei der Ausführung wird dann eine virtuelle Maschine gestartet, die den zweiten Teil des Übersetzungsprozesses in einem Just-In-Time Compiler erledigt.

Es existieren vier Compiler für C#:

Sprachelemente

C#-Syntaxbeispiel für ein einfaches Kommandozeilen-Programm:

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hallo Welt!");
    }
}

Einfache MessageBox in C#

using System;
using System.Windows.Forms;

class Program
{
    public static void Main()
    {
        MessageBox.Show("Text",
                        "Titel",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Hand);
    }
}

FileStream-Beispiel in C#

using System;
using System.IO;
using System.Text;

class Program
{
    public static void Main()
    {
        // Text, der in die Datei geschrieben wird
        const string textToWrite = "Hallo Welt";
        const string fileName = "dateiname.txt";

        // Datei "dateiname.txt" wird erstellt oder überschrieben
        using (var stream = new FileStream(fileName,
                                           FileMode.Create,
                                           FileAccess.Write))
        {
            // Der Text wird UTF8-kodiert in die Datei geschrieben
            var data = Encoding.UTF8.GetBytes(textToWrite);
            stream.Write(data, 0, data.Length);

            // Datei wird geschlossen...
        }
    }
}

Networking-Beispiel in C#

using System.Text;
using System.Net;
using System.Net.Sockets;
using static System.Console;

class Program
{
    public static void Main()
    {
        // Daten, die gesendet werden
        const string textToSend = "Hallo Welt";
        // Endpunkt, zu dem verbunden wird
        const string localhost = "127.0.0.1";
        const int port = 80;

        var data = Encoding.UTF8.GetBytes(textToSend);
        var ip = IPAddress.Parse(localhost);
        var ipEndPoint = new IPEndPoint(ip, port);

        // Socket, das verwendet wird
        using (var socket = new Socket(AddressFamily.InterNetwork,
                                       SocketType.Stream,
                                       ProtocolType.Tcp))
        {
            // Es wird zum Endpunkt verbunden
            socket.Connect(ipEndPoint);
            // Daten werden gesendet
            var byteCount = socket.Send(data, SocketFlags.None);
            WriteLine("Es wurden {0} bytes gesendet", byteCount);
            // Puffer für die zu empfangenen Daten
            var buffer = new byte[256];
            // Daten werden empfangen
            byteCount = socket.Receive(buffer, SocketFlags.None);

            // Wenn eine Antwort erhalten wurde, diese ausgeben
            if (byteCount > 0)
            {
                WriteLine("Es wurden {0} Bytes empfangen", byteCount);
                var answer = Encoding.UTF8.GetString(buffer);
                WriteLine("Empfangene Daten: {0}", answer);
            }

            // Verbindung wird geschlossen
        }
    }
}

Sprachderivate

Siehe auch

Literatur

Einzelnachweise

  1. Barry Cornelius: Java 5 catches up with C#. Abgerufen am 30. Mai 2022 (englisch).
  2. Bis hier her siehe:
  3. Archivierte Kopie (Memento des Originals vom 2. Dezember 2012 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.ecma-international.org
  4. Publicly Available Standards. Abgerufen am 30. Mai 2022.
  5. James Kovacs: C#/.NET History Lesson. 7. September 2007, abgerufen am 25. März 2015 (englisch).
  6. Naomi Hamilton: The A-Z of Programming Languages: C#. Interview mit Anders Hejlsberg. 1. Oktober 2008, abgerufen am 23. März 2015 (englisch).
  7. Standard ECMA-334 „C# Language Specification“. (PDF; 5,60 MB) Kapitel 6 „Acronyms and abbreviations“. (Nicht mehr online verfügbar.) Ecma International, Juni 2006, archiviert vom Original am 2. Dezember 2012; abgerufen am 23. März 2015 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.ecma-international.org
  8. Vorwort des Buches C# mit Methode, Christian Bleske (Hrsg.), Alexander Mayer, Michael Fischer, Michael Starke, Michael Steil (PDF (Memento des Originals vom 1. Februar 2012 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.cul.de)
  9. BillWagner: C#-Dokumentation: Einstieg, Tutorials, Referenz. Abgerufen am 3. Juni 2022 (deutsch).
  10. The .NET Compiler Platform. .NET Platform, 30. Mai 2022, abgerufen am 30. Mai 2022.
  11. C# Compiler | Mono. Abgerufen am 17. Mai 2021.

Weblinks

Wikibooks: Arbeiten mit .NET: C# – Lern- und Lehrmaterialien