mirror of
https://github.com/JG2401/CsharpVersionHistory.git
synced 2026-08-28 20:20:10 +00:00
version 4.0 - 13.0 (AI generated)
This commit is contained in:
16
README.md
16
README.md
@@ -11,3 +11,19 @@ Die Geschichte von C#
|
||||
## [Version 2.0](Version2.0/README.md)
|
||||
|
||||
## [Version 3.0](Version3.0/README.md)
|
||||
|
||||
## [Version 4.0](Version4.0/README.md)
|
||||
|
||||
## [Version 5.0](Version5.0/README.md)
|
||||
|
||||
## [Version 6.0](Version6.0/README.md)
|
||||
|
||||
## [Version 7.0](Version7.0/README.md)
|
||||
|
||||
## [Version 8.0](Version8.0/README.md)
|
||||
|
||||
## [Version 9.0](Version9.0/README.md)
|
||||
|
||||
## [Version 10.0](Version10.0/README.md)
|
||||
|
||||
## [Version 11.0](Version11.0/README.md)
|
||||
87
Version10.0/README.md
Normal file
87
Version10.0/README.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# C# Version 10.0
|
||||
|
||||
Veröffentlicht im November 2021 mit .NET 6.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Datensatzstrukturen
|
||||
Records können jetzt auch als Strukturen (`record struct`) definiert werden.
|
||||
|
||||
```csharp
|
||||
public record struct Punkt(int X, int Y);
|
||||
```
|
||||
|
||||
### Verbesserungen von Strukturtypen
|
||||
Strukturen und anonyme Typen unterstützen jetzt `with`-Ausdrücke.
|
||||
|
||||
```csharp
|
||||
var p1 = new Punkt(1, 2);
|
||||
var p2 = p1 with { X = 3 };
|
||||
```
|
||||
|
||||
### Handler für interpolierte Zeichenfolgen
|
||||
Optimierte Verarbeitung von interpolierten Strings für bessere Performance.
|
||||
|
||||
```csharp
|
||||
Console.WriteLine($"Wert: {wert}");
|
||||
```
|
||||
|
||||
### global using-Direktiven
|
||||
Globale `using`-Anweisungen für das gesamte Projekt.
|
||||
|
||||
```csharp
|
||||
// global using System;
|
||||
```
|
||||
|
||||
### Dateibezogene Namespacedeklaration
|
||||
Einfachere Namespace-Deklaration am Dateianfang.
|
||||
|
||||
```csharp
|
||||
namespace MeinProjekt;
|
||||
```
|
||||
|
||||
### Erweiterte Eigenschaftenmuster
|
||||
Präzisere Muster für Eigenschaften.
|
||||
|
||||
```csharp
|
||||
if (person is { Adresse.Stadt: "Berlin" }) { /* ... */ }
|
||||
```
|
||||
|
||||
### Verbesserungen bei Lambda-Ausdrücken
|
||||
- Natürlicher Typ für Lambdas
|
||||
- Rückgabetyp deklarierbar
|
||||
- Attribute auf Lambdas möglich
|
||||
|
||||
```csharp
|
||||
Func<int, int> quad = x => x * x;
|
||||
[Obsolete] Func<int, int> alt = x => x + 1;
|
||||
```
|
||||
|
||||
### Zeichenfolgeninterpolation für const-Strings
|
||||
Konstante Strings können interpoliert werden, wenn alle Platzhalter konstant sind.
|
||||
|
||||
```csharp
|
||||
const string Name = "Jonas";
|
||||
const string Begruessung = $"Hallo, {Name}!";
|
||||
```
|
||||
|
||||
### sealed ToString in records
|
||||
`ToString` kann in record-Typen als `sealed` überschrieben werden.
|
||||
|
||||
### Verbesserte Warnungen für Null-Status und Zuweisungen
|
||||
|
||||
### Dekonstruktion: Zuweisung und Deklaration gleichzeitig möglich
|
||||
|
||||
### AsyncMethodBuilder-Attribut für Methoden
|
||||
|
||||
### CallerArgumentExpression-Attribut
|
||||
|
||||
### Neues Format für #line-Pragma
|
||||
|
||||
### Vorschaufeatures (nur mit `<LangVersion>preview</LangVersion>`)
|
||||
- Generische Attribute
|
||||
- Statische abstrakte Member in Schnittstellen
|
||||
|
||||
---
|
||||
|
||||
C# 10.0 bringt viele Verbesserungen für kompakteren, präziseren und leistungsfähigeren Code.
|
||||
95
Version11.0/README.md
Normal file
95
Version11.0/README.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# C# Version 11.0
|
||||
|
||||
Veröffentlicht im November 2022.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Unformatierte Zeichenfolgenliterale
|
||||
Mehrzeilige Strings ohne Escape-Zeichen.
|
||||
|
||||
```csharp
|
||||
string text = """
|
||||
Zeile 1
|
||||
Zeile 2
|
||||
""";
|
||||
```
|
||||
|
||||
### Generische Mathematik
|
||||
Numerische Algorithmen können für alle Zahlentypen geschrieben werden.
|
||||
|
||||
```csharp
|
||||
static T Add<T>(T a, T b) where T : INumber<T> => a + b;
|
||||
```
|
||||
|
||||
### Generische Attribute
|
||||
Attribute können generisch sein.
|
||||
|
||||
```csharp
|
||||
[MyAttribute<int>]
|
||||
public class Beispiel { }
|
||||
```
|
||||
|
||||
### UTF-8-Zeichenfolgenliterale
|
||||
Direkte UTF-8-Strings.
|
||||
|
||||
```csharp
|
||||
ReadOnlySpan<byte> utf8 = "Hallo"u8;
|
||||
```
|
||||
|
||||
### Zeilenvorschübe in Zeichenfolgeninterpolation
|
||||
Zeilenumbrüche sind in interpolierten Strings erlaubt.
|
||||
|
||||
```csharp
|
||||
string info = $"Name: {name}
|
||||
Alter: {alter}";
|
||||
```
|
||||
|
||||
### Listenmuster
|
||||
Vergleich von Listenstrukturen mit Mustern.
|
||||
|
||||
```csharp
|
||||
if (arr is [1, 2, ..])
|
||||
{
|
||||
// Beginnt mit 1, 2
|
||||
}
|
||||
```
|
||||
|
||||
### Dateilokale Typen
|
||||
Typen können nur innerhalb einer Datei sichtbar sein.
|
||||
|
||||
```csharp
|
||||
file class Helper { }
|
||||
```
|
||||
|
||||
### Erforderliche Member
|
||||
Member müssen beim Initialisieren gesetzt werden.
|
||||
|
||||
```csharp
|
||||
public class Person
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
### Automatische Standardstrukturen
|
||||
Strukturen erhalten automatisch einen Standardwert.
|
||||
|
||||
### Musterabgleich Span<char> für string
|
||||
Vergleich von `Span<char>` mit konstanten Strings.
|
||||
|
||||
### Erweiterter nameof-Bereich
|
||||
`nameof` kann in mehr Kontexten verwendet werden.
|
||||
|
||||
### Numerisches IntPtr
|
||||
`IntPtr` unterstützt numerische Operationen.
|
||||
|
||||
### ref-Felder und scoped ref
|
||||
Mehr Kontrolle über Referenzen und Lebensdauer.
|
||||
|
||||
### Verbesserte Methodengruppenkonvertierung zu Delegaten
|
||||
|
||||
### Warnungswelle 7
|
||||
|
||||
---
|
||||
|
||||
C# 11.0 bringt viele Features für moderne, sichere und flexible Programmierung.
|
||||
74
Version12.0/README.md
Normal file
74
Version12.0/README.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# C# Version 12.0
|
||||
|
||||
Veröffentlicht im November 2023.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Primäre Konstruktoren
|
||||
Erstellen Sie Konstruktoren direkt in der Klassen- oder Strukturdefinition.
|
||||
|
||||
```csharp
|
||||
public class Person(string name, int alter)
|
||||
{
|
||||
public string Name { get; } = name;
|
||||
public int Alter { get; } = alter;
|
||||
}
|
||||
```
|
||||
|
||||
### Sammlungsausdrücke
|
||||
Neue Syntax für die Erstellung und Erweiterung von Sammlungen.
|
||||
|
||||
```csharp
|
||||
int[] zahlen = [1, 2, 3];
|
||||
int[] mehrZahlen = [..zahlen, 4, 5];
|
||||
```
|
||||
|
||||
### Inlinearrays
|
||||
Arrays mit fester Größe direkt in einem `struct`.
|
||||
|
||||
```csharp
|
||||
public struct Buffer
|
||||
{
|
||||
private inline int[8] data;
|
||||
}
|
||||
```
|
||||
|
||||
### Optionale Parameter in Lambdaausdrücken
|
||||
Lambda-Parameter können Standardwerte haben.
|
||||
|
||||
```csharp
|
||||
Func<int, int, int> addiere = (a, b = 1) => a + b;
|
||||
```
|
||||
|
||||
### ref readonly-Parameter
|
||||
Mehr Klarheit für APIs mit `ref`- oder `in`-Parametern.
|
||||
|
||||
```csharp
|
||||
void Print(ref readonly int x)
|
||||
{
|
||||
Console.WriteLine(x);
|
||||
}
|
||||
```
|
||||
|
||||
### Alias eines beliebigen Typs
|
||||
`using` kann für jeden Typ als Alias verwendet werden.
|
||||
|
||||
```csharp
|
||||
using Ganzzahl = System.Int32;
|
||||
Ganzzahl x = 5;
|
||||
```
|
||||
|
||||
### Experimentattribute
|
||||
Kennzeichnen Sie experimentelle Features.
|
||||
|
||||
```csharp
|
||||
[Experimental]
|
||||
void NeueFunktion() { }
|
||||
```
|
||||
|
||||
### Interceptors (Preview)
|
||||
Erlauben das Abfangen und Modifizieren von Methodenaufrufen (nur als Preview verfügbar).
|
||||
|
||||
---
|
||||
|
||||
C# 12.0 bringt neue Syntax und Features für produktiveren und konsistenteren Code.
|
||||
65
Version13.0/README.md
Normal file
65
Version13.0/README.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# C# Version 13.0
|
||||
|
||||
Freigegeben im November 2024.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### params Collections
|
||||
Der `params`-Modifikator ist jetzt für beliebige Sammlungen wie `Span<T>` und Schnittstellentypen erlaubt.
|
||||
|
||||
```csharp
|
||||
void PrintAll(params Span<int> zahlen) { /* ... */ }
|
||||
```
|
||||
|
||||
### Neuer lock-Typ und Semantik
|
||||
`lock` unterstützt jetzt `System.Threading.Lock` mit exklusivem Bereich und Dispose-Muster.
|
||||
|
||||
```csharp
|
||||
lock (meinLock)
|
||||
{
|
||||
// exklusiver Bereich
|
||||
}
|
||||
```
|
||||
|
||||
### Neue Escape-Sequenz: `\e`
|
||||
Das Escape-Zeichen (Unicode U+001B) kann als `\e` verwendet werden.
|
||||
|
||||
```csharp
|
||||
char esc = '\e';
|
||||
```
|
||||
|
||||
### Optimierungen bei Methodengruppen-Überlastauflösung
|
||||
|
||||
### Impliziter Indexerzugriff in Objektinitialisierern
|
||||
Der Indexoperator `^` ist jetzt in Objektinitialisierungen erlaubt.
|
||||
|
||||
```csharp
|
||||
var arr = new int[] { 1, 2, 3, 4 };
|
||||
var obj = new MyClass { Werte = { [^1] = 99 } };
|
||||
```
|
||||
|
||||
### ref in Iteratoren und asynchronen Methoden
|
||||
`ref` kann in nativen und unsicheren Kontexten in Iteratoren und async-Methoden verwendet werden.
|
||||
|
||||
### ref struct-Typen implementieren Schnittstellen
|
||||
`ref struct`-Typen können Schnittstellen implementieren.
|
||||
|
||||
```csharp
|
||||
ref struct Buffer : IBuffer { /* ... */ }
|
||||
```
|
||||
|
||||
### ref struct als Typargument in Generika
|
||||
`ref struct`-Typen sind als Typargumente für Generika erlaubt.
|
||||
|
||||
### Partielle Eigenschaften und Indexer
|
||||
Teilweise deklarierte Eigenschaften und Indexer sind in `partial`-Typen möglich.
|
||||
|
||||
### Überlastauflösung mit Priorität
|
||||
Bibliotheksautoren können Überladungen als bevorzugt kennzeichnen.
|
||||
|
||||
### Vorschau: `field`-Schlüsselwort
|
||||
Das kontextbezogene Schlüsselwort `field` erlaubt Zugriff auf das Backing-Feld einer automatisch implementierten Eigenschaft.
|
||||
|
||||
---
|
||||
|
||||
C# 13.0 bringt neue Möglichkeiten für Sammlungen, Locking, Typen und Initialisierungen sowie weitere Optimierungen.
|
||||
40
Version4.0/README.md
Normal file
40
Version4.0/README.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# C# Version 4.0
|
||||
|
||||
C# 4.0 wurde mit Visual Studio 2010 veröffentlicht und brachte folgende Neuerungen:
|
||||
|
||||
## Dynamische Bindung (`dynamic`)
|
||||
Das `dynamic`-Schlüsselwort erlaubt es, den Typ einer Variable erst zur Laufzeit festzulegen. Dies ähnelt dynamisch typisierten Sprachen wie JavaScript.
|
||||
|
||||
```csharp
|
||||
dynamic x = "Hallo";
|
||||
Console.WriteLine(x.Length); // Funktioniert, da x zur Laufzeit ein string ist
|
||||
```
|
||||
|
||||
## Benannte und optionale Argumente
|
||||
Methodenparameter können beim Aufruf benannt und/oder weggelassen werden. Das vereinfacht Methodenüberladungen und erhöht die Flexibilität.
|
||||
|
||||
```csharp
|
||||
void Print(string text, int times = 1)
|
||||
{
|
||||
for (int i = 0; i < times; i++)
|
||||
Console.WriteLine(text);
|
||||
}
|
||||
|
||||
Print("Hi", times: 3); // Benannter Parameter
|
||||
Print("Hallo"); // Optionaler Parameter
|
||||
```
|
||||
|
||||
## Generische Kovarianz und Kontravarianz
|
||||
Erlaubt mehr Flexibilität beim Arbeiten mit Generics, besonders für Framework- und Bibliotheksautoren.
|
||||
|
||||
```csharp
|
||||
IEnumerable<string> strings = new List<string>();
|
||||
IEnumerable<object> objects = strings; // Kovarianz
|
||||
```
|
||||
|
||||
## Eingebettete Interop-Typen
|
||||
Vereinfacht die Bereitstellung von COM-Interopassemblys durch das Einbetten der benötigten Typen direkt in die Anwendung.
|
||||
|
||||
---
|
||||
|
||||
Das wichtigste Feature war die Einführung von `dynamic`, das mächtige, aber auch fehleranfällige Konstrukte ermöglicht.
|
||||
33
Version5.0/README.md
Normal file
33
Version5.0/README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# C# Version 5.0
|
||||
|
||||
Veröffentlicht im August 2012 mit Visual Studio 2012.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Asynchrone Member (`async` und `await`)
|
||||
Ermöglichen die einfache und übersichtliche asynchrone Programmierung.
|
||||
|
||||
```csharp
|
||||
public async Task<int> GetDataAsync()
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
return 42;
|
||||
}
|
||||
```
|
||||
|
||||
### CallerInfo-Attribute
|
||||
Erlauben den Zugriff auf Informationen über den Aufrufer einer Methode, z.B. Dateiname, Methodenname oder Zeilennummer.
|
||||
|
||||
```csharp
|
||||
void Log(string message,
|
||||
[CallerMemberName] string memberName = "",
|
||||
[CallerFilePath] string filePath = "",
|
||||
[CallerLineNumber] int lineNumber = 0)
|
||||
{
|
||||
Console.WriteLine($"{message} in {memberName} ({filePath}:{lineNumber})");
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Das Highlight dieser Version sind die Schlüsselwörter `async` und `await`, die Asynchronität zum festen Bestandteil der Sprache machen.
|
||||
69
Version6.0/README.md
Normal file
69
Version6.0/README.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# C# Version 6.0
|
||||
|
||||
Veröffentlicht im Juli 2015 mit Visual Studio 2015.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Statische Importe
|
||||
Erlaubt das direkte Verwenden von statischen Methoden ohne Klassennamen.
|
||||
|
||||
```csharp
|
||||
using static System.Console;
|
||||
WriteLine("Hallo Welt!");
|
||||
```
|
||||
|
||||
### Ausnahmefilter
|
||||
Ermöglicht das Filtern von Exceptions mit Bedingungen.
|
||||
|
||||
```csharp
|
||||
try { /* ... */ }
|
||||
catch (Exception ex) when (ex.Message.Contains("kritisch"))
|
||||
{
|
||||
// Nur bei bestimmten Fehlern
|
||||
}
|
||||
```
|
||||
|
||||
### Initialisierer für automatische Eigenschaften
|
||||
Automatische Eigenschaften können direkt initialisiert werden.
|
||||
|
||||
```csharp
|
||||
public int Zahl { get; set; } = 42;
|
||||
```
|
||||
|
||||
### Ausdruckskörpermember
|
||||
Kürzere Syntax für Methoden und Eigenschaften.
|
||||
|
||||
```csharp
|
||||
public int Quadrat(int x) => x * x;
|
||||
```
|
||||
|
||||
### Nullpropagator
|
||||
Vereinfacht den Umgang mit null-Werten.
|
||||
|
||||
```csharp
|
||||
int? länge = text?.Length;
|
||||
```
|
||||
|
||||
### Zeichenfolgeninterpolation
|
||||
Einfaches Einfügen von Variablen in Strings.
|
||||
|
||||
```csharp
|
||||
string name = "Jonas";
|
||||
string begruessung = $"Hallo, {name}!";
|
||||
```
|
||||
|
||||
### `nameof`-Operator
|
||||
Gibt den Namen eines Symbols als String zurück.
|
||||
|
||||
```csharp
|
||||
Console.WriteLine(nameof(name)); // "name"
|
||||
```
|
||||
|
||||
### Weitere Features
|
||||
- Indexinitialisierer
|
||||
- `await` in `catch`- und `finally`-Blöcken
|
||||
- Standardwerte für Getter-exklusive Eigenschaften
|
||||
|
||||
---
|
||||
|
||||
C# 6.0 machte den Code kompakter und lesbarer. Außerdem wurde der Roslyn-Compiler als Dienst veröffentlicht, der nun selbst in C# geschrieben ist.
|
||||
72
Version7.0/README.md
Normal file
72
Version7.0/README.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# C# Version 7.0
|
||||
|
||||
Veröffentlicht im März 2017 mit Visual Studio 2017.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Out-Variablen
|
||||
Direkte Deklaration von Variablen im `out`-Parameter.
|
||||
|
||||
```csharp
|
||||
if (int.TryParse("123", out int zahl))
|
||||
{
|
||||
Console.WriteLine(zahl);
|
||||
}
|
||||
```
|
||||
|
||||
### Tupel und Dekonstruktionen
|
||||
Mehrere Werte einfach zurückgeben und zerlegen.
|
||||
|
||||
```csharp
|
||||
(string Name, int Alter) GetPerson() => ("Jonas", 30);
|
||||
var (name, alter) = GetPerson();
|
||||
```
|
||||
|
||||
### Mustervergleich
|
||||
Vergleiche mit Mustern für mehr Lesbarkeit.
|
||||
|
||||
```csharp
|
||||
if (obj is string s)
|
||||
{
|
||||
Console.WriteLine($"String: {s}");
|
||||
}
|
||||
```
|
||||
|
||||
### Lokale Funktionen
|
||||
Funktionen innerhalb von Methoden definieren.
|
||||
|
||||
```csharp
|
||||
void Hauptfunktion()
|
||||
{
|
||||
int Addiere(int a, int b) => a + b;
|
||||
Console.WriteLine(Addiere(2, 3));
|
||||
}
|
||||
```
|
||||
|
||||
### Erweiterte Ausdruckskörpermember
|
||||
Mehr Möglichkeiten für kurze Methoden und Eigenschaften.
|
||||
|
||||
```csharp
|
||||
public int Quadrat(int x) => x * x;
|
||||
```
|
||||
|
||||
### Lokale ref-Variablen und Ref-Rückgaben
|
||||
Direkter Zugriff und Rückgabe von Referenzen.
|
||||
|
||||
```csharp
|
||||
ref int Suche(int[] arr, int wert)
|
||||
{
|
||||
for (int i = 0; i < arr.Length; i++)
|
||||
if (arr[i] == wert) return ref arr[i];
|
||||
throw new Exception("Nicht gefunden");
|
||||
}
|
||||
```
|
||||
|
||||
### Weitere Features
|
||||
- Verwerfen mit `_`
|
||||
- Binäre Literale (`0b1010`) und Zahlentrennzeichen (`1_000_000`)
|
||||
- Throw-Ausdrücke (`throw new Exception()` direkt in Ausdrücken)
|
||||
|
||||
---
|
||||
|
||||
Diese Features machen den Code noch kompakter und lesbarer. .NET Core unterstützt nun alle Betriebssysteme und fokussiert sich auf Cloud und Portabilität.
|
||||
49
Version7.1/README.md
Normal file
49
Version7.1/README.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# C# Version 7.1
|
||||
|
||||
Veröffentlicht im August 2017.
|
||||
|
||||
Mit C# 7.1 wurden Punktreleases eingeführt. Diese Version brachte ein Konfigurationselement zur Auswahl der Sprachversion, drei neue Sprachfeatures und neues Compilerverhalten.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### async Main-Methode
|
||||
Der Einstiegspunkt einer Anwendung kann jetzt `async` sein.
|
||||
|
||||
```csharp
|
||||
static async Task Main(string[] args)
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
Console.WriteLine("Async Main!");
|
||||
}
|
||||
```
|
||||
|
||||
### default-Literale Ausdrücke
|
||||
Sie können `default` als Wert verwenden, wenn der Zieltyp bekannt ist.
|
||||
|
||||
```csharp
|
||||
int x = default;
|
||||
MyClass obj = default;
|
||||
```
|
||||
|
||||
### Abgeleitete Tupelelementnamen
|
||||
Tupelelementnamen werden aus der Initialisierung abgeleitet.
|
||||
|
||||
```csharp
|
||||
var name = "Jonas";
|
||||
var alter = 30;
|
||||
var person = (name, alter); // person.name, person.alter
|
||||
```
|
||||
|
||||
### Musterabgleich für generische Typparameter
|
||||
Musterabgleich funktioniert jetzt auch mit generischen Typen.
|
||||
|
||||
```csharp
|
||||
bool IstString<T>(T value) => value is string;
|
||||
```
|
||||
|
||||
### Compileroptionen
|
||||
Neue Optionen `-refout` und `-refonly` zur Steuerung der Referenzassembly-Generierung.
|
||||
|
||||
---
|
||||
|
||||
C# 7.1 brachte kleine, aber nützliche Verbesserungen für moderne und flexible Programmierung.
|
||||
98
Version7.2/README.md
Normal file
98
Version7.2/README.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# C# Version 7.2
|
||||
|
||||
Veröffentlicht im November 2017.
|
||||
|
||||
Mit C# 7.2 wurden einige kleine, aber nützliche Sprachfeatures hinzugefügt:
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Initialisierer für stackalloc-Arrays
|
||||
Direkte Initialisierung von Arrays auf dem Stack.
|
||||
|
||||
```csharp
|
||||
Span<int> zahlen = stackalloc int[] { 1, 2, 3 };
|
||||
```
|
||||
|
||||
### fixed-Anweisung für beliebige Typen
|
||||
`fixed` kann mit jedem Typ verwendet werden, der ein Muster unterstützt.
|
||||
|
||||
### Zugriff auf feste Felder ohne Anheften
|
||||
Erlaubt den Zugriff auf Felder, ohne sie explizit zu fixieren.
|
||||
|
||||
### Neuzuweisung lokaler ref-Variablen
|
||||
Ref-Variablen können neu zugewiesen werden.
|
||||
|
||||
```csharp
|
||||
ref int r = ref arr[0];
|
||||
r = ref arr[1];
|
||||
```
|
||||
|
||||
### readonly struct-Typen
|
||||
Strukturen können als unveränderlich deklariert werden.
|
||||
|
||||
```csharp
|
||||
public readonly struct Punkt
|
||||
{
|
||||
public int X { get; }
|
||||
public int Y { get; }
|
||||
}
|
||||
```
|
||||
|
||||
### in-Parameter
|
||||
Argumente werden als Referenz übergeben, aber nicht verändert.
|
||||
|
||||
```csharp
|
||||
void Print(in int x)
|
||||
{
|
||||
Console.WriteLine(x);
|
||||
}
|
||||
```
|
||||
|
||||
### ref readonly-Rückgaben
|
||||
Methoden können einen Wert als Referenz zurückgeben, ohne Schreibzugriff zu erlauben.
|
||||
|
||||
```csharp
|
||||
public ref readonly int GetValue() => ref value;
|
||||
```
|
||||
|
||||
### ref struct-Typen
|
||||
Strukturen, die direkt auf verwalteten Speicher zugreifen und nur auf dem Stack liegen dürfen.
|
||||
|
||||
```csharp
|
||||
ref struct Buffer { /* ... */ }
|
||||
```
|
||||
|
||||
### Allgemeinere Beschränkungen
|
||||
Mehr Flexibilität bei Generics.
|
||||
|
||||
### Nicht schließende benannte Argumente
|
||||
Positionale Argumente können auf benannte Argumente folgen.
|
||||
|
||||
```csharp
|
||||
Print("Hallo", times: 3);
|
||||
```
|
||||
|
||||
### Führende Unterstriche in numerischen Literalen
|
||||
Numerische Literale dürfen mit Unterstrichen beginnen.
|
||||
|
||||
```csharp
|
||||
int zahl = _1_000_000;
|
||||
```
|
||||
|
||||
### private protected-Zugriffsmodifizierer
|
||||
Zugriff für abgeleitete Klassen innerhalb derselben Assembly.
|
||||
|
||||
```csharp
|
||||
private protected int Wert;
|
||||
```
|
||||
|
||||
### Bedingte ref-Ausdrücke
|
||||
Das Ergebnis eines bedingten Ausdrucks kann ein Verweis sein.
|
||||
|
||||
```csharp
|
||||
ref int r = ref (a > b ? ref x : ref y);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
C# 7.2 brachte viele kleine Verbesserungen für Performance, Lesbarkeit und Sicherheit.
|
||||
48
Version7.3/README.md
Normal file
48
Version7.3/README.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# C# Version 7.3
|
||||
|
||||
Veröffentlicht im Mai 2018.
|
||||
|
||||
C# 7.3 bringt zwei Hauptdesigns: bessere Performance für sicheren Code und inkrementelle Verbesserungen vorhandener Features. Es wurden auch neue Compileroptionen hinzugefügt.
|
||||
|
||||
## Neue Features für sicheren Code
|
||||
|
||||
- Zugriff auf feste Felder ohne Anheften
|
||||
- Neuzuweisung lokaler ref-Variablen
|
||||
- Initialisierer für stackalloc-Arrays
|
||||
- `fixed`-Anweisungen mit jedem Typ, der ein Muster unterstützt
|
||||
- Generischere Einschränkungen bei Generics
|
||||
|
||||
## Verbesserungen vorhandener Features
|
||||
|
||||
- Vergleich von Tupeltypen mit `==` und `!=`
|
||||
|
||||
```csharp
|
||||
(int, int) a = (1, 2);
|
||||
(int, int) b = (1, 2);
|
||||
bool gleich = a == b; // true
|
||||
```
|
||||
|
||||
- Ausdrucksvariablen an mehreren Standorten verwenden
|
||||
|
||||
```csharp
|
||||
if (int.TryParse("123", out int x) || int.TryParse("456", out x))
|
||||
Console.WriteLine(x);
|
||||
```
|
||||
|
||||
- Attribute für Sicherungsfelder von automatisch implementierten Eigenschaften
|
||||
|
||||
```csharp
|
||||
[field: NonSerialized]
|
||||
public int Wert { get; set; }
|
||||
```
|
||||
|
||||
- Verbesserte Methodenauflösung bei `in`-Parametern und Überladungen
|
||||
|
||||
## Neue Compileroptionen
|
||||
|
||||
- `-publicsign`: Ermöglicht das Signieren von Assemblys für OSS
|
||||
- `-pathmap`: Bietet Zuordnung für Quellverzeichnisse
|
||||
|
||||
---
|
||||
|
||||
C# 7.3 macht sicheren Code leistungsfähiger und verbessert bestehende Sprachfeatures.
|
||||
107
Version8.0/README.md
Normal file
107
Version8.0/README.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# C# Version 8.0
|
||||
|
||||
Veröffentlicht im September 2019.
|
||||
|
||||
C# 8.0 ist das erste Hauptrelease, das speziell auf .NET Core ausgerichtet ist. Viele Features benötigen neue CLR-Funktionen oder Bibliothekstypen aus .NET Core 3.0.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Readonly-Member
|
||||
Mit `readonly` können Member als unveränderlich markiert werden.
|
||||
|
||||
```csharp
|
||||
readonly struct Punkt
|
||||
{
|
||||
public int X { get; }
|
||||
public int Y { get; }
|
||||
public readonly int Abstand() => X * X + Y * Y;
|
||||
}
|
||||
```
|
||||
|
||||
### Standardschnittstellenmethoden
|
||||
Interfaces können nun Implementierungen für Methoden enthalten.
|
||||
|
||||
```csharp
|
||||
public interface IBeispiel
|
||||
{
|
||||
void Methode() => Console.WriteLine("Standardimplementierung");
|
||||
}
|
||||
```
|
||||
|
||||
### Verbesserungen am Musterabgleich
|
||||
|
||||
- **Switch-Ausdrücke**
|
||||
|
||||
```csharp
|
||||
string ergebnis = wert switch
|
||||
{
|
||||
1 => "eins",
|
||||
2 => "zwei",
|
||||
_ => "anderes"
|
||||
};
|
||||
```
|
||||
|
||||
- **Eigenschafts-, Tupel- und Positionsmuster**
|
||||
|
||||
```csharp
|
||||
if (person is { Name: "Jonas", Alter: 30 }) { /* ... */ }
|
||||
if ((x, y) is (0, 0)) { /* Ursprung */ }
|
||||
```
|
||||
|
||||
### using-Deklarationen
|
||||
Ressourcen werden automatisch am Ende des Blocks freigegeben.
|
||||
|
||||
```csharp
|
||||
using var stream = File.OpenRead("datei.txt");
|
||||
```
|
||||
|
||||
### Statische lokale Funktionen
|
||||
Lokale Funktionen können als `static` deklariert werden.
|
||||
|
||||
```csharp
|
||||
void Methode()
|
||||
{
|
||||
static int Add(int a, int b) => a + b;
|
||||
}
|
||||
```
|
||||
|
||||
### Verwerfbare Referenzstrukturen
|
||||
Strukturen können `IDisposable` implementieren.
|
||||
|
||||
### Nullwerte zulassende Verweistypen
|
||||
Erlaubt die explizite Angabe, ob ein Verweistyp `null` sein darf.
|
||||
|
||||
```csharp
|
||||
string? text = null;
|
||||
```
|
||||
|
||||
### Asynchrone Streams
|
||||
Daten können asynchron gestreamt werden.
|
||||
|
||||
```csharp
|
||||
async IAsyncEnumerable<int> Zahlen()
|
||||
{
|
||||
for (int i = 0; i < 5; i++)
|
||||
yield return i;
|
||||
}
|
||||
```
|
||||
|
||||
### Indizes und Bereiche
|
||||
Einfacher Zugriff auf Teile von Arrays und Listen.
|
||||
|
||||
```csharp
|
||||
int[] zahlen = { 1, 2, 3, 4, 5 };
|
||||
int letzter = zahlen[^1]; // 5
|
||||
int[] teil = zahlen[1..3]; // {2, 3}
|
||||
```
|
||||
|
||||
### NULL-Coalescing-Zuweisung
|
||||
Weist einen Wert nur zu, wenn die Variable `null` ist.
|
||||
|
||||
```csharp
|
||||
text ??= "Standardwert";
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
C# 8.0 bringt viele moderne Features, die vor allem mit .NET Core 3.0 optimal genutzt werden können.
|
||||
74
Version9.0/README.md
Normal file
74
Version9.0/README.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# C# Version 9.0
|
||||
|
||||
Veröffentlicht im November 2020 mit .NET 5.
|
||||
|
||||
## Neue Features
|
||||
|
||||
### Datensätze (`record`)
|
||||
Kompakte Syntax für unveränderliche Datencontainer mit Wertsemantik.
|
||||
|
||||
```csharp
|
||||
public record Person(string Name, int Alter);
|
||||
var p1 = new Person("Jonas", 30);
|
||||
var p2 = p1 with { Alter = 31 };
|
||||
```
|
||||
|
||||
### init-only-Setter
|
||||
Eigenschaften können nur bei der Initialisierung gesetzt werden.
|
||||
|
||||
```csharp
|
||||
public class Auto
|
||||
{
|
||||
public string Marke { get; init; }
|
||||
}
|
||||
```
|
||||
|
||||
### Top-Level-Anweisungen
|
||||
Kein `Main`-Methoden- oder Klassen-Wrapper nötig.
|
||||
|
||||
```csharp
|
||||
Console.WriteLine("Hallo Welt!");
|
||||
```
|
||||
|
||||
### Verbesserter Musterabgleich
|
||||
- **Relationale Muster:** `<`, `>`, `<=`, `>=`
|
||||
- **Logische Muster:** `and`, `or`, `not`
|
||||
|
||||
```csharp
|
||||
if (wert is >= 0 and <= 10) { /* ... */ }
|
||||
if (obj is not null) { /* ... */ }
|
||||
```
|
||||
|
||||
### Integerwerte mit nativer Größe
|
||||
`nint` und `nuint` für CPU-native Integer.
|
||||
|
||||
```csharp
|
||||
nint x = 42;
|
||||
```
|
||||
|
||||
### Funktionszeiger
|
||||
Direkte Zeiger auf Funktionen.
|
||||
|
||||
```csharp
|
||||
delegate*<int, int, int> addPtr = &Add;
|
||||
```
|
||||
|
||||
### Modulinitialisierer
|
||||
Methoden, die beim Laden einer Assembly ausgeführt werden.
|
||||
|
||||
```csharp
|
||||
[ModuleInitializer]
|
||||
public static void Init() { /* ... */ }
|
||||
```
|
||||
|
||||
### Weitere Features
|
||||
- Zieltypisierte `new`-Ausdrücke: `List<int> zahlen = new();`
|
||||
- Anonyme `static`-Funktionen: `static () => 42`
|
||||
- Lambda-Parameter verwerfen: `_ => ...`
|
||||
- Attribute auf lokale Funktionen
|
||||
- Erweiterung von `GetEnumerator()` für `foreach`
|
||||
- Partielle Methoden mit Rückgabewert und Zugriffsmodifizierer
|
||||
|
||||
---
|
||||
|
||||
C# 9.0 bringt viele moderne Features für produktiven, kompakten und sicheren Code.
|
||||
Reference in New Issue
Block a user