Entwicklung der Programmiersprache C# - ... · PDF fileLanguage Day HDM 2015 Entwicklung der...

55
Language Day HDM 2015 Entwicklung der Programmiersprache C# Referent: Mikhail Orleanskiy, IT-Designers GmbH ([email protected]) Stand: 6. November 2015 Eine Präsentation der IT-Designers Gruppe 1

Transcript of Entwicklung der Programmiersprache C# - ... · PDF fileLanguage Day HDM 2015 Entwicklung der...

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

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.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

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 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