WikiDer > C♯
C# | ||||
| Paradigma | Multiparadigmen-Programmiersprache | |||
| erschien | 2001 | |||
| Entwickelt von | Microsoft | |||
| Aktuelle Version | 8.0 (September 2019) | |||
| Typensystem | statisch, stark | |||
| Implementierungen | .NET-Framework, Mono | |||
| Beeinflusst von | C , Java, Eiffel, Modul-3 | |||
| Einfluss auf | d, Java, vala, Windows PowerShell | |||
| Dateierweiterungen | .cs | |||
| Webseite | (und) C# auf der Microsoft-Website | |||
| ||||
C# (Englisch ausgesprochen als "Cis") ist ein Programmiersprache entwickelt von Microsoft Im Rahmen des .GERADEInitiative und später als Standard akzeptiert von ECMA (ECMA-334) und ISO (ISO/IEC 23270). C# ist objektorientierten und sieht aus wie Syntax und Semantik stark auf Java, aber vor allem in späteren Versionen enthält alle Arten von Funktionen, die auch in anderen Programmierstilen gearbeitet werden kann, wobei insbesondere in der Bibliotheken- und Programmierumgebung ein starker Einfluss von Objekt Pascal und Delphi ist sichtbar. Dies ist nicht verwunderlich, da C# unter anderem als Microsofts Antwort auf Java gedacht ist und weil Anders Hejlsberg, der Designer von Delphi, hat auch eine führende Rolle in C# und .NET gespielt.
Die Sprache gilt als Verbesserung der Sprache C. Der Name ist eine Anspielung auf die Musik: eine Note, die einen Halbton höher ist als a C heißt C#, englische Aussprache Cis. Auf Niederländisch wäre das cis sein. |
C# wurde von Anders Hejlsberg entworfen und das Entwicklungsteam wird derzeit von Mads Torgersen geleitet. Die neueste Version ist 8.0, die 2019 zusammen mit . veröffentlicht wurde Visual Studio 2019-Version 16.3.
Designziele
Der Ecma-Standard listet diese Designziele für C# auf:[1]
- Die Sprache soll eine einfache, moderne, objektorientierte Programmiersprache für allgemeine Zwecke.
- Seine Sprache und Implementierungen sollten Software-Engineering-Prinzipien wie Strong Type Checking, Array Boundary Checking, Erkennung von Versuchen, nicht initialisierte Variablen zu verwenden und automatische Müllabfuhr. Robustheit, Langlebigkeit und Produktivität der Programmierer sind wichtig.
- Die Sprache ist für die Entwicklung von Softwarekomponenten vorgesehen, die für den Einsatz in verteilten Umgebungen geeignet sind.
- Portabilität ist für Quellcode- und Programmierer sehr wichtig, insbesondere für diejenigen, die bereits mit C und C vertraut sind.
- Unterstützung bei Internationalisierung ist sehr wichtig.
- C# soll zum Schreiben von Anwendungen sowohl für gehostete als auch für integrierte Systemevon sehr groß bis fortgeschritten Betriebssysteme verwenden, bis hin zu ganz kleinen mit speziellen Funktionen.
- Während C#-Anwendungen in Bezug auf Speicher- und Verarbeitungsleistungsanforderungen sparsam sein sollen, sollte die Sprache nicht direkt in Bezug auf Leistung und Größe mit C oder konkurrieren Assemblersprache.
Geschichte
Während der Entwicklung des .NET-Frameworks wurden die Klassenbibliotheken ursprünglich mit einem verwalteten Decodierungs-Compilersystem namens . geschrieben "Einfach verwaltetes C" (SMC).[2][3] Im Januar 1999 . gebildet Anders Hejlsberg ein Team, das damals eine neue Sprache namens Cool entwickelte, die für "C-like Object Oriented Language" stand.[4] Microsoft hatte erwogen, den Namen "Cool" als endgültigen Namen der Sprache beizubehalten, entschied sich jedoch aus markenrechtlichen Gründen dagegen. Als das .NET-Projekt öffentlich auf der Konferenz für professionelle Entwickler bis Juli 2000 wurde die Sprache in C# umbenannt, mit den Klassenbibliotheken und dem ASP.NETLaufzeit wurden nach C# portiert.
Hejlsberg ist der Hauptdesigner und Chefarchitekt von C# bei Microsoft und war zuvor am Design von Turbo-Pascal, Embarcadero Delphi (ehemals CodeGear Delphi, Inprise Delphi und Borland Delphi) und Visuelles J . In Interviews und Fachartikeln hat er festgestellt, dass Mängel[5] in den meisten gängigen Programmiersprachen (z. C , Java, Delphi und Smalltalk) waren die Grundlage für die Common Language Runtime (CLR), die wiederum die C#-Sprache selbst entwerfen.
James Gosling, der 1994 die Programmiersprache Java entwickelt hat, und Bill Joy, Mitbegründer von Sonne Mikrosysteme, der Gründer von Java, nannte C# eine "Nachahmung" von Java; Gosling fuhr fort, dass "[C#] eine Art Java ist, dessen Zuverlässigkeit, Produktivität und Sicherheit entfernt wurden." [6][7] Klaus Kreft und Angelika Langer (Autoren eines C-Streams-Buches) stellten in einem Blogbeitrag fest, dass "Java und C# fast identische Programmiersprachen sind. Langweilige Wiederholung ohne Innovation".[8] „Fast niemand würde behaupten, dass Java oder C# revolutionäre Programmiersprachen sind, die die Art und Weise, wie wir Programme schreiben, verändert haben“ und „C# hat viel von Java übernommen – und umgekehrt. Jetzt C# Boxen und Unboxing haben wir sehr ähnliche Funktionen in Java."[8] Im Juli 2000 sagte Hejlsberg, dass C# "kein Java-Klon ist und in seinem Design viel näher an C ist. C# entlehnt die meisten seiner Operatoren, Schlüsselwörter und Anweisungen direkt von C , wir haben uns Java angesehen, Modula 2, C und wir Wir haben uns Smalltalk angeschaut. Wir haben auch einige Spracheigenschaften, die Java nicht geerbt hat, zum Beispiel warum gibt es keine Aufzählungen in Java? Wir haben auch Operatorüberladungen und Typkonvertierungen, außerdem ist unsere komplette Namensraumstruktur viel näher an C".[9]
Seit der Veröffentlichung von C# 2.0 im November 2005 haben sich die Sprachen C# und Java auf immer unterschiedlicheren Bahnen weiterentwickelt und sind zu zwei recht unterschiedlichen Sprachen geworden. Eine der ersten großen Veränderungen kam mit der Aufnahme von generisch für beide Sprachen, mit sehr unterschiedlichen Implementierungen. C# verwendet Verdinglichung um generische "erste Klasse"-Objekte bereitzustellen, die wie jede andere Klasse verwendet werden können, wobei die Codegenerierung während des Klassenladens durchgeführt wird.[10] Darüber hinaus hat C# einige wichtige Funktionen hinzugefügt, um die Programmierung in funktional Stil möglich, gipfelnd in der LINQErweiterungen, die mit C# 3.0 und dem unterstützenden Framework von . veröffentlicht wurden LambdaAusdrücke, Erweiterungsmethoden und anonymes Tippen.[11] Diese Funktionen ermöglichen es C-Programmierern, funktionale Programmiertechniken zu verwenden, wie z Verschlüsse, wenn dies für ihre Anwendung von Vorteil ist. Die LINQ-Erweiterungen und der funktionale Import helfen Entwicklern dabei, die Menge an Standardcode zu reduzieren, die bei allgemeinen Aufgaben wie dem Anfordern einer Datenbank, sezieren a XMLDatei oder das Abfragen einer Datenstruktur, wobei der Schwerpunkt auf die eigentliche Programmlogik verlagert wird, um die Lesbarkeit und Wartbarkeit zu verbessern.
C# hatte früher ein Maskottchen namens Andy (benannt nach Anders Hejlsberg). Am 29.01.2004 trat er in den Ruhestand.
C# wurde ursprünglich dem ISO-Unterausschuss JTC 1/SC 22 gemäß ISO/IEC 23270:2003 zur Überprüfung vorgelegt, wurde zurückgezogen und anschließend gemäß ISO/IEC 23270:2006 genehmigt.
Name
Microsoft verwendete den Namen C# erstmals 1988 für eine Variante der C-Sprache, die für die inkrementelle Kompilierung entwickelt wurde.[12] Dieses Projekt wurde nicht abgeschlossen, aber der Name lebte weiter.
Der Name "cis" ist von der musikalischen Notation inspiriert, bei der ein cis angibt, dass die geschriebene Note einen Halbton höher gesetzt werden sollte.[13] Dies ähnelt dem Sprachnamen von C , wobei " " angibt, dass eine Variable nach der Auswertung um 1 erhöht werden soll. Das scharfe Symbol ähnelt auch einer Ligatur von vier " " -Symbolen (in einem Zwei-mal-Zwei-Raster), was weiter impliziert, dass die Sprache ein Inkrement von C ist.
Aufgrund technischer Einschränkungen der Anzeige (Standardschriftarten, Browser usw.) und der Tatsache, dass das Rautezeichen auf den meisten Tastaturen nicht vorhanden ist (U 266F ♯ MUSIC SHARP SIGN (HTML ♯ oder &Scharf;)), es wurde Nummernschild (U 0023 # NUMMERNZEICHEN (HTML # oder #)) gewählt, um das scharfe Symbol im geschriebenen Namen der Programmiersprache anzunähern. Diese Konvention spiegelt sich in der Sprachspezifikation ECMA-334-C# wider.
Das Suffix "scharf" wurde von einer Reihe anderer .NET-Sprachen verwendet, die Varianten bestehender Sprachen sind, einschließlich J# (eine ebenfalls von Microsoft entwickelte und von Java 1.1 abgeleitete .NET-Sprache), EIN (von Ada) und die funktionale Programmiersprache F♯. Eiffels ursprüngliche Implementierung für .NET hieß Eiffel, ein Name, der wieder fallen gelassen wurde, weil die vollständige Sprache von Eiffel wird jetzt unterstützt. Das Suffix wurde auch für Bibliotheken verwendet, wie z GTK# (ein .GERADE- Wrapper für GTK und andere GNOMEBibliotheken) und Cocoa# (ein Wrapper für Kakao).
Versionen
| Ausführung | Sprachspezifikation | Datum | .Net-Version | Visual Studio | ||
|---|---|---|---|---|---|---|
| Ecma | ISO/IEC | Microsoft | ||||
| C# 1.0 | Dezember 2002 [14] | April 2003 | Januar 2002 | Januar 2002 | .Net-Framework 1.0 | Visual Studio .Net 2002 |
| C# 1.1 C# 1.2 | Oktober 2003 | April 2003 | .Net-Framework 1.1 | Visual Studio .Net 2003 | ||
| C# 2.0 | Juni 2006 [15] | September 2005 | Nov. 2005 | .Net-Framework 2.0 .Net-Framework 3.0 | Visual Studio 2005 Visual Studio 2008 | |
| C# 3.0 | August 2007 | Nov. 2007 | .Net Framework 2.0 (außer LINQ) .Net Framework 3.0 (außer LINQ) .Net-Framework 3.5 | Visual Studio 2008 | ||
| C# 4.0 | April 2010 | April 2010 | .Net-Framework 4 | Visual Studio 2010 | ||
| C# 5.0 | Juni 2013 | August 2012 | .Net-Framework 4.5 | Visual Studio 2012 Visual Studio 2013 | ||
| C# 6.0[16] | Entwurf | Juli 2015 | .Net-Framework 4.6 .Net Core 1.0 .Net Core 1.1 | Visual Studio 2015 | ||
| C# 7.0[17] | Spezifikationsvorschlag | März 2017 | .Net-Framework 4.7 | Visual Studio 2017-Version 15.0 | ||
| C# 7.1[17] | Spezifikationsvorschlag | August 2017 | .Net Core 2.0 | Visual Studio 2017-Version 15.3 | ||
| C# 7.2[17] | Spezifikationsvorschlag | November 2017 | Visual Studio 2017-Version 15.5 | |||
| C# 7.3[17] | Spezifikationsvorschlag | Mai 2018 | .Net Core 2.1 .Net Core 2.2 .Net-Framework 4.8 | Visual Studio 2017 frisch 15.7 | ||
| C# 8.0 [18] | Spezifikationsvorschlag | September 2019 | .Net Core 3.0 | Visual Studio 2019-Version 16.3 | ||
| C# 9.0 [19] | .Net 5 | Visual Studio 2019-Version 16.8 [20] | ||||
| C# Weiter [21] | ||||||
Neue Sprachfunktionen
In der folgenden Versionstabelle wurden die englischen Begriffe hinzugefügt, da sie innerhalb der Domäne häufiger vorkommen.
C# 2.0
- Genericity (de: Generika)
- Anteilsklassen (und: Teiltypen)
- Anonyme Funktionen (de: anonyme Funktionen)[22]
- Iteratoren (und: Iteratoren)[23]
- Werttypen, die auch null sein können (und: Nullable-Werttypen)[24]
- Lockerer Zugang zum Getter/Setter
- Methodengruppenkonvertierungen (Delegierte)
- Ko- und Kontravarianz für Delegierte
- Statische Klassen
- Inferenz delegieren
- Null-Koaleszenz-Operator
C# 3.0
- Implizite typisierte lokale Variablen
- Objekt- und Sammlungsinitialisierer
- Automatisch implementierte Funktionen
- Anonyme Typen
- Erweiterungsmethoden
- Abfrageausdrücke
- Anonyme Funktion / Lambda-Ausdrücke
- Ausdrucksbäume
- Teilmethoden
C# 4.0
- Dynamische Bindungen
- Benannte und optionale Argumente
- Generische Ko- und Kontravarianz
- Eingebettete Interop-Typisierung ("NoPIA")
C# 5.0
- Async/await/asynchrone Methoden
- Anruferinformationsattribute
C# 6.0
- Compiler-as-a-Service
- Import von statischen Typmembern in Namespace
- Ausnahmefilter
- Warte in Fang-/Endlich-Blöcken
- Auto-Eigenschafteninitialisierer
- Standardwerte für Getter-Only-Eigenschaften
- Ausdruckskörper-Mitglieder (Roslyn)
- Nullpropagator / Operator für sichere Navigation / Operator für Nullbedingungen
- String-Interpolation
- Namedes Betreibers
- Wörterbuch Initialisierer
C# 7.0
- Inline-out-Variablendeklarationen
- Musterabgleich
- Tupeltypen und Tupelliterale
- Der Bau
- Lokale Funktionen
- Digitale Separatoren
- Binäre Literale
- Ref-Rückgaben und Einheimische
- Generische asynchrone Rückgabetypen
- Ausdruckskörper-Konstruktoren und Finalizer
- Getter und Setter mit Ausdruckskörper
- Wurf kann auch als Ausdruck verwendet werden
C# 7.1
- Asynchrone Hauptleitung
- Standard-Literalausdrücke
- Abgeleitete Tupelelementnamen
C# 7.2
- Referenzsemantik mit Werttypen
- Nicht nachfolgende benannte Argumente
- Führende Unterstriche in numerischen Literalen
- privater Protected-Access-Modifikator
C# 7.3
- Greifen Sie auf feste Felder zu, ohne zu pinnen
- Lokale Ref-Variablen neu zuweisen
- Verwenden von Initialisierern für Stackalloc-Arrays
- Feste Anweisungen mit jedem Typ verwenden, der ein Muster unterstützt
- Verwenden zusätzlicher allgemeiner Einschränkungen
C# 8.0
- readonly-struct-members
- Standardschnittstellenmitglieder
- Ausdrücke wechseln
- Eigenschafts-, Tupel- und Positionsmuster
- Deklarationen verwenden
- statische lokale Funktionen
- Einweg-Ref struct
- Nullable Referenztypen
- Indizes und Bereiche
- Null-Koaleszenz-Zuweisungen
- Asynchrone Streams
C# 9.0
- Zieltyp "neu"
- Überspringen der lokalen Initialisierung
- native ints
- Attribute für lokale Funktionen
- Funktionszeiger
- Verbesserungen beim Mustervergleich
- statische Lambdas
- Aufzeichnungen
- zieltypisierte Bedingungen
- kovariante Renditen
- Durchwahlnummer
- Modulinitiatoren
- Verlängerung teilweise
- to-level-Anweisungen
Beispiel
Unten ist ein Beispiel für eine kleine Hallo WeltAnwendung, geschrieben in C#:
mitSystem;ÖffentlichkeitKlasseHallo{PrivatgeländestatischLeereMain(){Konsole.WriteLine("Hallo Welt");}}Eine Quelldatei von C# wird mit cs- gespeichert.Dateierweiterung, zum Beispiel 'Hallo.cs'.
Im Vergleich mit Java und C
- Erbe: wie in Java gibt es einen unterschied zwischen Schnittstellen, die nur Methodendeklarationen enthalten, und Klassen, die Methoden implementieren kann, und eine Klasse kann nur von einer anderen Klasse erben, aber mehrere Schnittstellen implementieren. In C wird diese Unterscheidung nicht gemacht und Mehrfachvererbung von Klassen möglich.
- bool: es gibt keine implizite Konvertierung zwischen bool und int wie bei C . Wie bei C und Java können Konvertierungen mit Java durchgeführt werden typcasting. Ein boolescher Wert ist a Werttyp. Außerdem können in C# "primitive" Typen wie int und bool als Objekt angesprochen werden (Boxen), die eine Konvertierung wie 5.ToString() ; Java hat das jetzt auch.
- struct: C# (und das .NET-Framework) unterscheidet zwischen Referenztypen und Werttypen. Ein Werttyp wird in C# als . deklariert strukturieren, ein Referenztyp wie Klasse. Darüber hinaus haben sie die gleichen Nutzungsmöglichkeiten; ein strukturieren können beispielsweise Eigenschaften und Methoden haben. Der Unterschied besteht darin, dass die Instanzvariablen eines Werttyps nicht geändert werden können (solche Änderungen haben keine Auswirkungen). Structs können verhindern, dass sehr viele kleine Objekte den Overhead der Garbage Collection tragen. In C sind die Felder von a strukturieren tatsächlich ändern. Java hat keine Strukturen.
- delegieren: Dies sind typsichere Funktionszeiger. Delegaten gibt es in Java nicht; ihre Funktionalität wird oft mit a nachgeahmt innere Klasse, die eine Ein-Methoden-Schnittstelle implementiert.
- base und override: base ist wie in Java Super und override ist wie bei Java und C virtuell.
- Präprozessordirektiven: Java kennt das überhaupt nicht, nur C#
#definieren, die einen konstanten Wert definiert, und#wenn, die auf diesen Wert testet, so dass bedingte Zusammenstellung ist möglich. Ausdrücke in . werden nicht unterstützt#definieren,#einschließen, und andere Funktionen des C/C -Präprozessor. Die Rolle von#einschließenin C ist erfüllt durch mit in C# (und importieren in Java), die sich auf Namespaces statt auf Quellcode beziehen. - Betreiber: zusätzliche Operatoren existieren hier relativ zu C , wie zum Beispiel der ist, Asche, ?? und Art der, eine Teilmenge davon existiert auch in Java. C# unterstützt genau wie C Bedienerüberlastung; nicht Java.
- Main: wird verwendet, um den Einstiegspunkt für ein Programm anzugeben, wie in Java.
- Argumentübergabe: ist im Grunde wie in Java: normalerweise ist es so Anruf nach Wert, aber ref und aus kann zum Einstellen von Parametern verwendet werden nach referenz pass, was bedeutet, dass eine Zuweisung an die Argumentvariable im aufgerufenen Code auch die übergebene Variable im aufrufenden Code ändert; unsicher wird verwendet, um in nicht verwalteter Code explizite Zeiger (d. h. Speicheradressen).
- Saiten: Im Gegensatz zu C, wo es keine spezielle Klasse für Strings gibt, sondern ein String nur ein Zeiger auf einen Speicherbereich ist, in dem sich der String befindet, verwenden C# und Java beide einen Umbrella Zeichenfolge-Klasse. Diese sind normalerweise "copy-on-write" und einfacher zu ändern als die C-Strings. C unterstützt beide Methoden.
- foreach, in: röntgen lassen Arrays und Kollektionen zu iterieren (was die Biene a macht für Schleife notwendige explizite Indexvariable wird überflüssig) aber auch durch willkürliche aufzählbars, die wie Arrays und Sammlungen nicht immer einen vordefinierten Satz von Elementen enthalten müssen; sie entsprechen mehr oder weniger dem faule Listen von dem funktionale Programmierung. Java verwendet auch eine solche Iteration und seit Version 1.5 auch die für jedes-Konstruktion.
- mit: verwendet, um zu anderen zu wechseln Namensräume Referenz, ohne jedes Mal den vollständigen Namen angeben zu müssen. Diese Funktionalität ist auch in Java in Form von 'Paketen' vorhanden und Pakete können mit der Importanweisung importiert werden. In C existiert dies in der Sprache nicht, wird aber mit dem . simuliert Präprozessor, in C existiert dies jedoch in Form von 'Using Namespace'.
- Zerstörer: genau wie bei Java gibt es automatische Müllabfuhr, wodurch der Programmierer nicht mehr über das Löschen des Speichers nachdenken muss. In C und C muss der Programmierer dies selbst tun, obwohl es Bibliotheken gibt, die helfen können. In C# ist es möglich, wie in C und C sogenannten 'unsicheren' (unmanaged) Code mit Zeigern zu schreiben.
- Maschinencode versus Bytecode: C# und Java werden beide in Bytecode für a kompiliert virtuelle Maschine (VM), die auch als bezeichnet wird Laufzeit erwähnt wird und einmal in Betrieb genommen werden muss; diese Maschine wird mit JIT (Just-in-time-Kompilierung) den Bytecode einmalig zu Maschinencode kompilieren und ausführen lassen, und ist auch verantwortlich für Müllabfuhr. Andererseits wird Software in einer Sprache wie C direkt in Maschinensprache kompiliert, wonach die kompilierte Software auf den Maschinen installiert wird, auf denen die Software laufen soll; diese Software wird dann direkt von der Prozessor hingerichtet. Der Nachteil der Verwendung der virtuellen Maschine ist der Aufwand für das Booten und (einmalige) Kompilieren; andererseits ermöglicht es bestimmte Optimierungen bei der Kompilierung, die mit der Vorkompilierung nicht möglich sind.
Gemeinsame Zwischensprache
Das Gemeinsame Zwischensprache (CIL) ist die Bytecode-Spezifikation, nach der alle .NET-Sprachen kompilieren. Der CIL-Code wird von der Common Language Runtime (CLR) zur Laufzeit umgewandelt in Maschinensprache und durchgeführt. Da der CIL-Code zur Laufzeit kompiliert wird, kurz bevor er aufgerufen wird, wird er als JIT (Just In Time) Zusammenstellung. CIL ähnelt dem Bytecode in Javas .class-Dateien. Auch die VM von Java funktioniert ähnlich wie die .NET CLR.
CIL hieß früher MSIL, die Abkürzung für Microsoft Intermediate Language, wurde aber umbenannt, um sich zu qualifizieren als ISO-Standard.
Als Skriptsprache verwenden
Aufgrund seiner Flexibilität kann C# auch als Skriptsprache werden verwendet. So ist dies standardmäßig implementiert in Unity3D[25] und ist es auch möglich, C# als Skriptsprache für die unwirklicher Motor.[26] C# kann mit met . auch als Skriptsprache verwendet werden cs-Skript[27] und es ist möglich, C# als Skriptsprache in Anwendungen zu verwenden, die mit C geschrieben wurden.[28]
Unter Verwendung von ASP.NET kann C# als Alternative zu verwendet werden? PHP.
Siehe auch
Externe Links
Quellen, Anmerkungen und/oder Verweise
|
| .NET-Framework | ||||||||
|---|---|---|---|---|---|---|---|---|
|
| Programmiersprachen |
|---|
ABAP ·ABC ·ActionScript ·Ada ·algol ·APL ·Assemblersprachen ·AWK ·B ·BASIC ·BCPL ·C ·C ·C♯ ·sauber ·Schermaschine ·COBOL ·COMAL ·Curry ·d ·Eiffel ·Erlang ·F♯ ·her ·fortran ·gehen ·Haskell ·Symbol ·J ·Java ·Kotlin ·lispeln ·Logo ·lua ·m4 ·ML ·Modula-2 ·Oberon ·Objekt Pascal ·Ziel c ·Ocamli ·Unze ·Pascal ·perl ·PHP ·PL/I ·PL/SQL ·Prolog ·Prova ·Python ·Rexx ·Rollenspiel ·Rubin ·Frieden ·SAS ·Reichweite ·planen ·Selbst ·Simula ·Smalltalk ·Schnell ·TCL ·Typoskript ·vala ·Visual Basic |