Language Day HDM 2015 Entwicklung der Programmiersprache C# Referent: Mikhail Orleanskiy, IT-Designers GmbH (orleanskiy@it-designers.de) Stand: 6. November 2015 Eine Präsentation der IT-Designers Gruppe 1
C# 2.0 bis 5.0 C# 2.0 bis 5.0 Neu in C# 6.0 Eine Präsentation der IT-Designers Gruppe 2
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.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 Windows Forms deutlich verbessert ASP.NET deutlich verbessert Sicherheit (ACL, Data Protection...) Networking FTP, WS2.0, SMTP... Fusion 2.0 XSLT 64 Bit C# 2.0, Generics 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 Windows Communication Foundation Windows Forms deutlich verbessert Windows Presentation Foundation ASP.NET deutlich verbessert Workflow Foundation Sicherheit (ACL, Data Protection...) Windows CardSpace Networking FTP, WS2.0, SMTP... Fusion 2.0 XSLT 64 Bit C# 2.0, Generics 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 CLR Security verbessert (Vista Support) C# 3.0 LINQ Windows Communication Foundation Windows Forms deutlich verbessert Windows Presentation Foundation ASP.NET deutlich verbessert CLR Speed Improvements (Thread Pools etc.) Garbage Collector verbessert Workflow Foundation Sicherheit (ACL, Data Protection...) BCL (Basisklassen) neue Methoden Extensibility (System.Addin.*) Windows CardSpace Networking FTP, WS2.0, SMTP... Fusion 2.0 XSLT 64 Bit C# 2.0, Generics 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 Covariance and Contravariance in Generics Dynamic Language Runtime CLR Security verbessert (Vista Support) C# 3.0 LINQ Windows Communication Foundation Windows Forms deutlich verbessert Background Garbage Collection Code Contracts Windows Presentation Foundation ASP.NET deutlich verbessert CLR Speed Improvements (Thread Pools etc.) Managed Extensibility Framework Garbage Collector verbessert Workflow Foundation Sicherheit (ACL, Data Protection...) Parallel Computing (PLINQ) Memory-Mapped Files BCL (Basisklassen) neue Methoden Extensibility (System.Addin.*) Windows CardSpace Networking FTP, WS2.0, SMTP... Fusion 2.0 XSLT 64 Bit C# 2.0, Generics 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 WinRT / Windows 8 / Metro Parallel Computing (async / await) Covariance and Contravariance in Generics Dynamic Language Runtime CLR Security verbessert (Vista Support) C# 3.0 LINQ Windows Communication Foundation Windows Forms deutlich verbessert Background Garbage Collection Code Contracts Windows Presentation Foundation ASP.NET deutlich verbessert CLR Speed Improvements (Thread Pools etc.) Managed Extensibility Framework Garbage Collector verbessert Workflow Foundation Sicherheit (ACL, Data Protection...) Parallel Computing (PLINQ) Memory-Mapped Files BCL (Basisklassen) neue Methoden Extensibility (System.Addin.*) Windows CardSpace Networking FTP, WS2.0, SMTP... Fusion 2.0 XSLT 64 Bit C# 2.0, Generics 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine Präsentation der IT-Designers Gruppe 4
C# 2.0 bis 5.0 /.NET 1.0-5.0 Compiler as a Service / Roslyn WinRT / Windows 8 / Metro Open Source... Parallel Computing (async / await) Covariance and Contravariance in Generics Dynamic Language Runtime CLR Security verbessert (Vista Support) C# 3.0 LINQ Windows Communication Foundation Windows Forms deutlich verbessert Background Garbage Collection Code Contracts Windows Presentation Foundation ASP.NET deutlich verbessert CLR Speed Improvements (Thread Pools etc.) Managed Extensibility Framework Garbage Collector verbessert Workflow Foundation Sicherheit (ACL, Data Protection...) Parallel Computing (PLINQ) Memory-Mapped Files BCL (Basisklassen) neue Methoden Extensibility (System.Addin.*) Windows CardSpace Networking FTP, WS2.0, SMTP... Fusion 2.0 XSLT 64 Bit C# 2.0, Generics 1.0 (2002) Web Services verbessert ASP.NET verbessert.net für Mobile Geräte 1.1 (2003) 2.0 (2006) 3.0 (2006) 3.5 (2007) 4.0 (2010) 1.0 4.5 (2012) 4.6/5.0 (2015) Historie.NET 1.0 bis 5.0 Eine 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 "; C# 2.0??? Eine Präsentation der IT-Designers Gruppe 6
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 "; C# 2.0??? Eine Präsentation der IT-Designers Gruppe 6
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 "; C# 2.0??? Eine Präsentation der IT-Designers Gruppe 6
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 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# 2.0 bis 5.0 / Neu in C# 3.0 C# 3.0 Erweiterungsmethoden ermöglichen es einem bereits definierten Typ, nachträglich Methoden hinzuzufügen Nur verwenden, wenn der zu modifizierende Typ nicht direkt verä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 Methods Eine Präsentation der IT-Designers Gruppe 9
C# 2.0 bis 5.0 / Neu in C# 3.0 C# 3.0 Erweiterungsmethoden ermöglichen es einem bereits definierten Typ, nachträglich Methoden hinzuzufügen Nur verwenden, wenn der zu modifizierende Typ nicht direkt verä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 ()); False True Extension Methods Eine Präsentation der IT-Designers Gruppe 9
C# 2.0 bis 5.0 / Neu in C# 3.0 C# 3.0 Eigenschaften können vom Compiler auch automatisch implementiert werden public class Student public string Name get ; set ; public int Matrikelnummer get ; set ; Automatische Eigenschaften Eine Präsentation der IT-Designers Gruppe 10
C# 2.0 bis 5.0 / Neu in C# 3.0 C# 3.0 C# 3.0 führt den Operator => ein, dieser wird auch als Lambda-Operator bezeichnet Der Operator verbessert die Erstellung von anonymen Methoden x => x * x (x, y) => x == y ( int x, string s) => s. Length > x () => SomeMethod () Lambda Ausdrück Eine Präsentation der IT-Designers Gruppe 11
C# 2.0 bis 5.0 / Neu in C# 3.0 x => x +1 x => return x +1; int x => x+1; C# 3.0 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ücke Eine Präsentation der IT-Designers Gruppe 12
C# 2.0 bis 5.0 / Neu in C# 3.0 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ücke Eine Präsentation der IT-Designers Gruppe 13
C# 2.0 bis 5.0 / Neu in C# 3.0 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 ); dominik markus Lambda Ausdrücke Eine Präsentation der IT-Designers Gruppe 13
C# 2.0 bis 5.0 / Neu in C# 3.0 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 Query Eine Präsentation der IT-Designers Gruppe 14
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 LINQ Eine Präsentation der IT-Designers Gruppe 15
C# 2.0 bis 5.0 / Neu in C# 3.0 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 1 Eine Präsentation der IT-Designers Gruppe 16
C# 2.0 bis 5.0 / Neu in C# 3.0 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); 10 9 8 7 6 5 4 3 2 1 LINQ Beispiel 1 Eine Präsentation der IT-Designers Gruppe 16
C# 2.0 bis 5.0 / Neu in C# 3.0 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 2 Eine Präsentation der IT-Designers Gruppe 17
C# 2.0 bis 5.0 / Neu in C# 3.0 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); 11 10 9 8 7 6 5 4 3 2 LINQ Beispiel 2 Eine Präsentation der IT-Designers Gruppe 17
C# 2.0 bis 5.0 / Neu in C# 3.0 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 <5 select n; foreach ( int x in selected ) Console. WriteLine (x); LINQ Beispiel 3 Eine Präsentation der IT-Designers Gruppe 18
C# 2.0 bis 5.0 / Neu in C# 3.0 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 <5 select n; foreach ( int x in selected ) Console. WriteLine (x); 4 3 2 1 LINQ Beispiel 3 Eine Präsentation der IT-Designers Gruppe 18
C# 2.0 bis 5.0 / Neu in C# 3.0 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 4 Eine Präsentation der IT-Designers Gruppe 19
C# 2.0 bis 5.0 / Neu in C# 3.0 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 4 Eine Präsentation der IT-Designers Gruppe 19
C# 2.0 bis 5.0 / Neu in C# 3.0 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 5 Eine Präsentation der IT-Designers Gruppe 20
C# 2.0 bis 5.0 / Neu in C# 3.0 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 5 Eine Präsentation der IT-Designers Gruppe 20
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 Samples Eine 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 Parameter public void SagHallo () SagHallo (" Welt "); // Ueberladen mit Parameter public void SagHallo ( string name ) Console. WriteLine ("Hallo, " + name + "!"); Jetzt: public void SagHallo ( string name = " Welt ") Console. WriteLine ("Hallo, " + name + "!"); Optionale Parameter Eine 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 LINQ Eine Präsentation der IT-Designers Gruppe 24
C# 2.0 bis 5.0 / Neu in C# 4.0 Sequentielle Abfrage int [] numbers = 10, 9, 8, 7, 6, 5, 4, 3, 2, 1; IEnumerable <int > selected = from n in numbers where n <5 orderby n select n; Parallele Abfrage int [] numbers = 10, 9, 8, 7, 6, 5, 4, 3, 2, 1; IEnumerable <int > selected = from n in numbers. AsParallel () where n <5 orderby n select n; Einfache parallele Datenabfrage Eine 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 Abfrage var 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 Abfrage var 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. PLINQ Eine 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 Abfrage var 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 Abfrage var 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.7839955 Ergebnis 19532483 in 00:00:05.9427227 LINQ vs. PLINQ Eine Präsentation der IT-Designers Gruppe 26
Neu in C# 6.0 C# 2.0 bis 5.0 Neu in C# 6.0 Eine Präsentation der IT-Designers Gruppe 27
Neu in C# 6.0 / Initialisierung readonly Auto-Properties Neu in C# 6.0 Initialisierung readonly Auto-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; C# 6.0 Jetzt: public class Customer public List <int > Versions get; set; = new List <int >(); public byte State get; = 1; Initialisierung readonly Auto-Properties Eine Präsentation der IT-Designers Gruppe 29
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); C# 6.0 Jetzt: class Point public int X get; set; public int Y get; set; public override string ToString () return $"X / Y"; Interpolation von Zeichenketten Eine Präsentation der IT-Designers Gruppe 31
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"; C# 6.0 Jetzt: class Point public int X get; set; public int Y get; set; public override string ToString () => $"X / Y"; Lambda-Ausdrücke als Methodenrumpf Eine Präsentation der IT-Designers Gruppe 33
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); C# 6.0 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 Eigenschaftenrumpf Eine Präsentation der IT-Designers Gruppe 34
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"]); C# 6.0 return null ; Der Elvis-Operator Eine Präsentation der IT-Designers Gruppe 36
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"]); C# 6.0 return null ; Der Elvis-Operator Eine Präsentation der IT-Designers Gruppe 36
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"]); C# 6.0 return null ; Der Elvis-Operator Eine Präsentation der IT-Designers Gruppe 36