Language Day HDM 2015
Entwicklung derProgrammiersprache C#
Referent: Mikhail Orleanskiy, IT-Designers GmbH ([email protected])
Stand: 6. November 2015
Eine Präsentation der IT-Designers Gruppe 1
C# 2.0 bis 5.0 / .NET 1.0-5.0
C# 2.0 bis 5.0
.NET 1.0-5.0
Eine Präsentation der IT-Designers Gruppe 3
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
Fusion 2.0 XSLT 64 Bit C# 2.0, Generics
Windows Formsdeutlich verbessert
ASP.NET deut-lich verbessert
Sicherheit (ACL,Data Protection...)
Networking FTP,WS2.0, SMTP...
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
Fusion 2.0 XSLT 64 Bit C# 2.0, Generics
Windows Formsdeutlich verbessert
ASP.NET deut-lich verbessert
Sicherheit (ACL,Data Protection...)
Networking FTP,WS2.0, SMTP...
Windows Commu-nication Foundation
Windows Presen-tation Foundation Workflow Foundation Windows CardSpace
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
Fusion 2.0 XSLT 64 Bit C# 2.0, Generics
Windows Formsdeutlich verbessert
ASP.NET deut-lich verbessert
Sicherheit (ACL,Data Protection...)
Networking FTP,WS2.0, SMTP...
Windows Commu-nication Foundation
Windows Presen-tation Foundation Workflow Foundation Windows CardSpace
C# 3.0 LINQ Garbage Collec-tor verbessert
Extensibility (Sys-tem.Addin.*)
CLR Security verbes-sert (Vista Support)
CLR Speed Improve-ments (Thread Pools etc.) BCL (Basisklassen) neue Methoden
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
Fusion 2.0 XSLT 64 Bit C# 2.0, Generics
Windows Formsdeutlich verbessert
ASP.NET deut-lich verbessert
Sicherheit (ACL,Data Protection...)
Networking FTP,WS2.0, SMTP...
Windows Commu-nication Foundation
Windows Presen-tation Foundation Workflow Foundation Windows CardSpace
C# 3.0 LINQ Garbage Collec-tor verbessert
Extensibility (Sys-tem.Addin.*)
CLR Security verbes-sert (Vista Support)
CLR Speed Improve-ments (Thread Pools etc.) BCL (Basisklassen) neue Methoden
Dynamic Language Runtime Code ContractsManaged Exten-
sibility Framework Memory-Mapped Files
Covariance and Con-travariance in Generics
Background Garbage Collection Parallel Computing (PLINQ)
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
Fusion 2.0 XSLT 64 Bit C# 2.0, Generics
Windows Formsdeutlich verbessert
ASP.NET deut-lich verbessert
Sicherheit (ACL,Data Protection...)
Networking FTP,WS2.0, SMTP...
Windows Commu-nication Foundation
Windows Presen-tation Foundation Workflow Foundation Windows CardSpace
C# 3.0 LINQ Garbage Collec-tor verbessert
Extensibility (Sys-tem.Addin.*)
CLR Security verbes-sert (Vista Support)
CLR Speed Improve-ments (Thread Pools etc.) BCL (Basisklassen) neue Methoden
Dynamic Language Runtime Code ContractsManaged Exten-
sibility Framework Memory-Mapped Files
Covariance and Con-travariance in Generics
Background Garbage Collection Parallel Computing (PLINQ)
WinRT / Windows 8 / Metro Parallel Computing (async / await)
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / .NET 1.0-5.0
1.0
Web Services verbessert ASP.NET verbessert .NET für Mobile Geräte
Fusion 2.0 XSLT 64 Bit C# 2.0, Generics
Windows Formsdeutlich verbessert
ASP.NET deut-lich verbessert
Sicherheit (ACL,Data Protection...)
Networking FTP,WS2.0, SMTP...
Windows Commu-nication Foundation
Windows Presen-tation Foundation Workflow Foundation Windows CardSpace
C# 3.0 LINQ Garbage Collec-tor verbessert
Extensibility (Sys-tem.Addin.*)
CLR Security verbes-sert (Vista Support)
CLR Speed Improve-ments (Thread Pools etc.) BCL (Basisklassen) neue Methoden
Dynamic Language Runtime Code ContractsManaged Exten-
sibility Framework Memory-Mapped Files
Covariance and Con-travariance in Generics
Background Garbage Collection Parallel Computing (PLINQ)
WinRT / Windows 8 / Metro Parallel Computing (async / await)
Compiler as a Service / Roslyn Open Source...
1.0(2002)
1.1(2003)
2.0(2006)
3.0(2006)
3.5(2007)
4.0(2010)
4.5(2012)
4.6/5.0(2015)
Historie .NET 1.0 bis 5.0Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 / Neu in C# 2.0
C# 2.0 bis 5.0
Neu in C# 2.0
Eine Präsentation der IT-Designers Gruppe 5
C# 2.0 bis 5.0 / Neu in C# 2.0
Wie lässt sich folgender Code vereinfachen?public static void Main(){
Console.WriteLine(MachNullZuString("Hallo"));Console.WriteLine(MachNullZuString(null));
}
static string MachNullZuString(string v){
if(v!=null){
return v;}return "nullwert";
}
? ??Eine Präsentation der IT-Designers Gruppe 6
C# 2.0
C# 2.0 bis 5.0 / Neu in C# 2.0
Wie lässt sich folgender Code vereinfachen?public static void Main(){
Console.WriteLine(MachNullZuString("Hallo"));Console.WriteLine(MachNullZuString(null));
}
static string MachNullZuString(string v){
return (v != null) ? v : "nullwert";}
? ??Eine Präsentation der IT-Designers Gruppe 6
C# 2.0
C# 2.0 bis 5.0 / Neu in C# 2.0
Wie lässt sich folgender Code vereinfachen?public static void Main(){
Console.WriteLine(MachNullZuString("Hallo"));Console.WriteLine(MachNullZuString(null));
}
static string MachNullZuString(string v){
return v ?? "nullwert";}
? ??Eine Präsentation der IT-Designers Gruppe 6
C# 2.0
C# 2.0 bis 5.0 / Neu in C# 3.0
C# 2.0 bis 5.0
Neu in C# 3.0
Eine Präsentation der IT-Designers Gruppe 7
C# 2.0 bis 5.0 / Neu in C# 3.0
• Erlaubt es, den Typ einer lokalen Variablen herzuleiten
var alter = 30;var name = "Kevin Erath";var wurzelZwei = Math.Sqrt (2);var meinArray = new int[] { 1, 2, 3, 4 };
• Ist das Gleiche wie
int alter = 30;string name = "Kevin Erath";double wurzelZwei = Math.Sqrt (2);int[] meinArray = new int[] { 1, 2, 3, 4 };
Was ist Type Inference?Eine Präsentation der IT-Designers Gruppe 8
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Erweiterungsmethoden ermöglichen es einem bereitsdefinierten Typ, nachträglich Methoden hinzuzufügen
• Nur verwenden, wenn der zu modifizierende Typ nicht direktverändert werden kann- z. B. bei Klassen die als sealed gekennzeichnet sind
public static class MyExtensions{
public static bool IsKevin(this string str){
return str == "Kevin";}
}
string testString = "Thomas";Console.WriteLine(testString.IsKevin ());Console.WriteLine("Kevin".IsKevin ());
Extension MethodsEine Präsentation der IT-Designers Gruppe 9
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Erweiterungsmethoden ermöglichen es einem bereitsdefinierten Typ, nachträglich Methoden hinzuzufügen
• Nur verwenden, wenn der zu modifizierende Typ nicht direktverändert werden kann- z. B. bei Klassen die als sealed gekennzeichnet sind
public static class MyExtensions{
public static bool IsKevin(this string str){
return str == "Kevin";}
}
string testString = "Thomas";Console.WriteLine(testString.IsKevin ());Console.WriteLine("Kevin".IsKevin ());
FalseTrue
Extension MethodsEine Präsentation der IT-Designers Gruppe 9
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Eigenschaften können vom Compiler auch automatischimplementiert werden
public class Student{
public string Name{
get;set;
}
public int Matrikelnummer{
get;set;
}}
Automatische EigenschaftenEine Präsentation der IT-Designers Gruppe 10
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• C# 3.0 führt den Operator => ein, dieser wird auch alsLambda-Operator bezeichnet
• Der Operator verbessert die Erstellung von anonymenMethoden
x => x * x(x, y) => x == y(int x, string s) => s.Length > x() => SomeMethod ()
Lambda AusdrückEine Präsentation der IT-Designers Gruppe 11
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
x => x +1x => {return x+1;}int x => x+1;
• Der Ausdruck ist wie folgt zu verstehen:- Wende die folgende Funktion auf Variable x an.- F(x) = x+1
• Wie eine Formel in der Mathematik ;-)
Lambda AusdrückeEine Präsentation der IT-Designers Gruppe 12
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Finde alle Namen, die ein k enthalten:
private static void Main(){
var list = new List <string > {"dominik", "roland","thomas", "markus", "alon"};
var result = list.FindAll(val => val.Contains("k"));foreach (var name in result){
Console.WriteLine(name);}
}
Lambda AusdrückeEine Präsentation der IT-Designers Gruppe 13
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Finde alle Namen, die ein k enthalten:
private static void Main(){
var list = new List <string > {"dominik", "roland","thomas", "markus", "alon"};
var result = list.FindAll(val => val.Contains("k"));foreach (var name in result){
Console.WriteLine(name);}
}
dominikmarkus
Lambda AusdrückeEine Präsentation der IT-Designers Gruppe 13
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Sprachänderungen in C# 3.0 haben nur ein Ziel→ LINQ zu ermöglichen
• Bietet eine native Sprache, um Datenquellen abzufragen- Abfragesprache sieht ähnlich wie SQL aus
• Prinzipiell gibt es drei Varianten:- DLINQ → Relationale Datenabfrage- XLINQ → XML-basierte Datenabfrage- Standard Query Operators → Objektabfrage
Language INtegrated QueryEine Präsentation der IT-Designers Gruppe 14
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
Es gibt zwei Möglichkeiten eine Datenabfrage zu formulieren:
• Abfragesyntax (ähnlich wie SQL)
• Methodensyntax (Erweiterungsmethoden)
Beide Möglichkeiten sind gleichwertig.
Datenabfragen mit LINQEine Präsentation der IT-Designers Gruppe 15
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte abrufen
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
select n;foreach (int x in selected){
Console.WriteLine(x);}
LINQ Beispiel 1Eine Präsentation der IT-Designers Gruppe 16
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte abrufen
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
select n;foreach (int x in selected){
Console.WriteLine(x);}
10987654321
LINQ Beispiel 1Eine Präsentation der IT-Designers Gruppe 16
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte abrufen und um eins erhöhen
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
select n + 1;foreach (int x in selected){
Console.WriteLine(x);}
LINQ Beispiel 2Eine Präsentation der IT-Designers Gruppe 17
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte abrufen und um eins erhöhen
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
select n + 1;foreach (int x in selected){
Console.WriteLine(x);}
111098765432
LINQ Beispiel 2Eine Präsentation der IT-Designers Gruppe 17
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte abrufen, die kleiner 5 sind
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
where n<5select n;
foreach (int x in selected){
Console.WriteLine(x);}
LINQ Beispiel 3Eine Präsentation der IT-Designers Gruppe 18
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte abrufen, die kleiner 5 sind
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
where n<5select n;
foreach (int x in selected){
Console.WriteLine(x);}
4321
LINQ Beispiel 3Eine Präsentation der IT-Designers Gruppe 18
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte zählen, die ungerade sind
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};int ungeradeZahlen = numbers.Count(n => n % 2 == 1);Console.WriteLine("Ungerade Zahlen: " + ungeradeZahlen);
LINQ Beispiel 4Eine Präsentation der IT-Designers Gruppe 19
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Werte zählen, die ungerade sind
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};int ungeradeZahlen = numbers.Count(n => n % 2 == 1);Console.WriteLine("Ungerade Zahlen: " + ungeradeZahlen);
Ungerade Zahlen: 5
LINQ Beispiel 4Eine Präsentation der IT-Designers Gruppe 19
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Person mit bestimmtem Alter ermitteln• Bisher:
public IEnumerable <Person > FindPerson(int alter){
foreach (var person in personen){
if (person.Age > alter){
yield return person;}
}}
LINQ Beispiel 5Eine Präsentation der IT-Designers Gruppe 20
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Alle Person mit bestimmtem Alter ermitteln• Bisher:
public IEnumerable <Person > FindPerson(int alter){
foreach (var person in personen){
if (person.Age > alter){
yield return person;}
}}
• Mit LINQ:public IEnumerable <Person > FindPerson(int alter){
return personen.Where(p => p.Age > alter);}
LINQ Beispiel 5Eine Präsentation der IT-Designers Gruppe 20
C# 3.0
C# 2.0 bis 5.0 / Neu in C# 3.0
• Weitere Beispiele gibt es unter:• http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
101 LINQ SamplesEine Präsentation der IT-Designers Gruppe 21
C# 2.0 bis 5.0 / Neu in C# 4.0
C# 2.0 bis 5.0
Neu in C# 4.0
Eine Präsentation der IT-Designers Gruppe 22
C# 2.0 bis 5.0 / Neu in C# 4.0
• Setzen von Defaultwerten für Übergabeparameter• Aufrufer kann diese durch eigene Werte ersetzen• Bisher:
// Ueberladen ohne Parameterpublic void SagHallo (){
SagHallo("Welt");}
// Ueberladen mit Parameterpublic void SagHallo(string name){
Console.WriteLine("Hallo , " + name + "!");}
• Jetzt:public void SagHallo(string name = "Welt"){
Console.WriteLine("Hallo , " + name + "!");}
Optionale ParameterEine Präsentation der IT-Designers Gruppe 23
C# 2.0 bis 5.0 / Neu in C# 4.0
• Datenzugriff parallelisieren
• LINQ-Abfragen auf mehreren Kernen auszuführen
• Verwendet intern TPL für die Parallelisierung
• Unterstützt alle Standard .NET Abfrage Operatoren
• Es gibt zwei Möglichkeiten:- ParallelEnumerable-Klasse- AsParallel()-Erweiterungsmethode
Parallel LINQEine Präsentation der IT-Designers Gruppe 24
C# 2.0 bis 5.0 / Neu in C# 4.0
• Sequentielle Abfrageint[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers
where n<5orderby nselect n;
• Parallele Abfrageint[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};IEnumerable <int > selected = from n in numbers.AsParallel ()
where n<5orderby nselect n;
Einfache parallele DatenabfrageEine Präsentation der IT-Designers Gruppe 25
C# 2.0 bis 5.0 / Neu in C# 4.0
using System;using System.Diagnostics;using System.Linq;
class Program{
static void Main(){
var numbers = new byte [1000000000];new Random ().NextBytes(numbers);
var watch = new Stopwatch ();watch.Start();// LINQ Abfragevar r1 = (from n in numbers where n<5 orderby n select n).Count();watch.Stop();Console.WriteLine("Ergebnis " + r1 + " in " + watch.Elapsed);
watch.Restart ();// PLINQ Abfragevar r2 = (from n in numbers.AsParallel () where n<5 orderby n
select n).Count();watch.Stop();Console.WriteLine("Ergebnis " + r2 + " in " + watch.Elapsed);
}}
LINQ vs. PLINQEine Präsentation der IT-Designers Gruppe 26
C# 2.0 bis 5.0 / Neu in C# 4.0
using System;using System.Diagnostics;using System.Linq;
class Program{
static void Main(){
var numbers = new byte [1000000000];new Random ().NextBytes(numbers);
var watch = new Stopwatch ();watch.Start();// LINQ Abfragevar r1 = (from n in numbers where n<5 orderby n select n).Count();watch.Stop();Console.WriteLine("Ergebnis " + r1 + " in " + watch.Elapsed);
watch.Restart ();// PLINQ Abfragevar r2 = (from n in numbers.AsParallel () where n<5 orderby n
select n).Count();watch.Stop();Console.WriteLine("Ergebnis " + r2 + " in " + watch.Elapsed);
}}
Ergebnis 19532483 in 00:00:21.7839955Ergebnis 19532483 in 00:00:05.9427227
LINQ vs. PLINQEine Präsentation der IT-Designers Gruppe 26
Neu in C# 6.0 / Initialisierung readonly Auto-Properties
Neu in C# 6.0
Initialisierung readonlyAuto-Properties
Eine Präsentation der IT-Designers Gruppe 28
Neu in C# 6.0 / Initialisierung readonly Auto-Properties
Bisher:public class Customer{
public List <int > Versions { get; set; }public byte State { get; private set; }
public Customer (){
Versions = new List <int >();State = 1;
}}
Jetzt:public class Customer{
public List <int > Versions { get; set; } = new List <int >();public byte State { get; } = 1;
}
Initialisierung readonly Auto-PropertiesEine Präsentation der IT-Designers Gruppe 29
C# 6.0
Neu in C# 6.0 / Interpolation von Zeichenketten
Neu in C# 6.0
Interpolation von Zeichenketten
Eine Präsentation der IT-Designers Gruppe 30
Neu in C# 6.0 / Interpolation von Zeichenketten
Bisher:class Point{
public int X { get; set; }public int Y { get; set; }
public override string ToString (){
return string.Format("{0} / {1}", X, Y);}
}
Jetzt:class Point{
public int X { get; set; }public int Y { get; set; }
public override string ToString (){
return $"{X} / {Y}";}
}
Interpolation von ZeichenkettenEine Präsentation der IT-Designers Gruppe 31
C# 6.0
Neu in C# 6.0 / Lambda-Ausdrücke als Rümpfe
Neu in C# 6.0
Lambda-Ausdrücke als Rümpfe
Eine Präsentation der IT-Designers Gruppe 32
Neu in C# 6.0 / Lambda-Ausdrücke als Rümpfe
Bisher:class Point{
public int X { get; set; }public int Y { get; set; }
public override string ToString (){
return $"{X} / {Y}";}
}
Jetzt:class Point{
public int X { get; set; }public int Y { get; set; }
public override string ToString () => $"{X} / {Y}";}
Lambda-Ausdrücke als MethodenrumpfEine Präsentation der IT-Designers Gruppe 33
C# 6.0
Neu in C# 6.0 / Lambda-Ausdrücke als Rümpfe
Bisher:public class Point{
public int X { get; set; }public int Y { get; set; }
public double Distance{
get { return Math.Sqrt(X*X+Y*Y); }}
}
Jetzt:public class Point{
public int X { get; set; }public int Y { get; set; }
public double Distance => Math.Sqrt(X*X+Y*Y);}
Lambda-Ausdrücke als EigenschaftenrumpfEine Präsentation der IT-Designers Gruppe 34
C# 6.0
Neu in C# 6.0 / Null-Wert Operator
Neu in C# 6.0
Null-Wert Operator
Eine Präsentation der IT-Designers Gruppe 35
Neu in C# 6.0 / Null-Wert Operator
Wie kann folgendes vereinfacht werden?class Point{
public int X { get; set; }public int Y { get; set; }
public static Point FromJson(JObject obj){
if (obj != null &&obj["x"] != null && obj["x"].Type == JTokenType.Integer &&obj["y"] != null && obj["y"].Type == JTokenType.Integer)
{return new Point((int)obj["x"], (int)obj["y"]);
}return null;
}}
Der Elvis-OperatorEine Präsentation der IT-Designers Gruppe 36
C# 6.0
Neu in C# 6.0 / Null-Wert Operator
Wie kann folgendes vereinfacht werden? ?. Und weiter?class Point{
public int X { get; set; }public int Y { get; set; }
public static Point FromJson(JObject obj){
if (obj != null &&// obj["x"] != null && obj["x"]. Type == JTokenType.Integer &&// obj["y"] != null && obj["y"]. Type == JTokenType.Integer)
obj["x"]?. Type == JTokenType.Integer &&obj["y"]?. Type == JTokenType.Integer)
{return new Point((int)obj["x"], (int)obj["y"]);
}return null;
}}
Der Elvis-OperatorEine Präsentation der IT-Designers Gruppe 36
C# 6.0
Neu in C# 6.0 / Null-Wert Operator
Wie kann folgendes vereinfacht werden? ?. Und weiter? ?
class Point{
public int X { get; set; }public int Y { get; set; }
public static Point FromJson(JObject obj){
// if (obj != null &&// obj["x"]?. Type == JTokenType.Integer &&// obj["y"]?. Type == JTokenType.Integer)
if (obj?["x"]?. Type == JTokenType.Integer &&obj?["y"]?. Type == JTokenType.Integer)
{return new Point((int)obj["x"], (int)obj["y"]);
}return null;
}}
Der Elvis-OperatorEine Präsentation der IT-Designers Gruppe 36
C# 6.0