31
Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

  • Upload
    others

  • View
    4

  • Download
    1

Embed Size (px)

Citation preview

Page 1: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

Digicomp Microsoft Evolution Day 2015 1

C# 6.0 und die .NET Compiler Platform (Roslyn)

Hans Peter Bornhauser

Partner:

Page 2: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

2Digicomp Microsoft Evolution Day 2015

Worum geht es?

Neue Sprachfeatures in C# 6.0

Neues in Visual Studio 2015

Roslyn – Compilerplattform

Ausblick auf nächste Version

Page 3: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

3Digicomp Microsoft Evolution Day 2015

Referent: Hans Peter Bornhauser

Dipl. Ing ETH

Software Architekt, Senior Software Engineer, Beraterund Trainer bei Noser Engineering AG in Winterthur

.NET Trainer bei Digicomp

14 Jahre Erfahrung in.NET Entwicklung(seit Beta 1.0)

ASP.NET MVC

WPF und Silverlight

WCF und Entity Framework

Microsoft Certifications

MCSD Web Applications .NET 4.5

MCT (Certified Trainer)

Page 4: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

4Digicomp Microsoft Evolution Day 2015

Initialisierung von Auto Properties

Auto Properties ohne Setter

Expression Bodies

Verwendung statischer Klassen

Der «Null-conditional» Operator

String Interpolation

nameof

Intializer für Collections mit Indexzugriff

Exception Filter

await in catch- und finally-Blöcken

Neues in C# 6.0

Page 5: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

Digicomp 5

C# 6.0 Demo

Page 6: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

6Digicomp Microsoft Evolution Day 2015

Initialisierung von Auto Properties

Auto Properties können direkt mit einem Wert initialisiert werden

public string Name { get; set; } = "Hejlsberg";

private IList<string> Hobbies { get; set; } = new List<string>();

Dies funktioniert auch ohne Setter

public Guid Id { get; } = Guid.NewGuid();

public DateTime CreationDate { get; } = DateTime.Now;

Somit gibt es jetzt echte readonly Properties

Getter Properties dürfen im Konstruktor initialisiert werden

Page 7: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

7Digicomp Microsoft Evolution Day 2015

Expression Bodies

Bisherpublic Func<int, int, int> Add

{ get { return (x, y) => x + y; } }

Neu

public int Add(int x, int y) => x + y;

Weitere Beispielepublic double Distance(int x, int y) => Math.Sqrt(x * x + y * y);

public double Volume(double a, double b, double c) => a * b * c;

Einschränkungen Keine geschwungenen Klammern im Ausdruck, also nur Rückgabewert

Page 8: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

8Digicomp Microsoft Evolution Day 2015

Verwendung statischer Klassen

using static System.Math;

using static System.Console;

using static System.Linq.Enumerable;

public static void Main(string[] args)

{

double degrees = 90;

double angle = PI * degrees / 180.0; // Math.PI

double sinAngle = Sin(angle); // Math.Sin

WriteLine("angle {0}", sinAngle); // Console.WriteLine

var range = Range(1, 10); // Enumerable.Range

var odd = Where(range, i => i % 2 == 1);// Extension Method: Error

var oddNumbers = range.Where(i => i % 2 == 1);

}

Sinnvoll für mathematische Funktionen und tw. Konstanten

Page 9: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

9Digicomp Microsoft Evolution Day 2015

Der «Null-conditional» Operator

Keine expliziten null-Checks mehr Anstatt

string name = null;

var customer = GetCustomer();

if (customer != null)

name = customer.Name;

schreibt manstring name = GetCustomer()?.Name;

oderint? length = customers?.Length;

ohne Nullable Typeint length = customers?.Length ?? 0;

Page 10: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

10Digicomp Microsoft Evolution Day 2015

«Null-conditional» Operator als Event Handler

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)

{

// until C# 5.0

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

// without null check, thread-safe

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

Page 11: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

11Digicomp Microsoft Evolution Day 2015

String Interpolation

Keine nummerierten Platzhalter mehr

var s = $"{p.Name,20} is {p.Age:D3} year{{s}} old";

// kompiliert zu

// string.Format("{0,20} is {1:D3} year{{s}} old", p.Name, p.Age);

Page 12: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

12Digicomp Microsoft Evolution Day 2015

nameof

Namen von Variablen zu Compilezeit festlegen (=> Refactoring)

throw new ArgumentNullException(nameof(parameter));

public string FirstName{

get { return _firstName; }set{

if (String.IsNullOrEmpty(value))throw new ArgumentException(nameof(FirstName)); // Verwendung von nameof

_firstName = value;OnPropertyChanged(); // C# 5 mit CallerMembernameOnPropertyChanged(nameof(FullName)); // Fullname ändert wenn Firstname ändert

}}

private void OnPropertyChanged([CallerMemberName] string propertyName = ""){

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}

Page 13: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

13Digicomp Microsoft Evolution Day 2015

Intializer für Collections mit Indexzugriff

Syntactic Sugarvar coordinate = new JObject{

["x"] = 3, ["y"] = 7

};var testValues = new Dictionary<int, string> {

[2] = "V2", [5] = "V5"

};

Unterscheidet sich kaum vonvar coordinate = new JObject{

{ "x", 3 }, { "y", 7 }

};

Page 14: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

14Digicomp Microsoft Evolution Day 2015

Exception Filters

try{

var content = File.ReadLines(fileName);}catch (ArgumentException) when (fileName == string.Empty){

Console.WriteLine("filename is empty");}catch (ArgumentException ex) when (ex.Message.Contains("illegal")){

Console.WriteLine("invalid characters in filename");}catch (FileNotFoundException){

Console.WriteLine($"file '{fileName}' not found");}catch (Exception ex){

Console.WriteLine("Unknown error: " + ex.Message);}

Page 15: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

15Digicomp Microsoft Evolution Day 2015

await in catch- und finally-Blöcken

await ist auch in catch und finally Blöcken erlaubtServiceClient service = new ServiceClient();string data = "C# is great";

try{

await service.SaveAsync(data);}catch (Exception ex){

await LoggingService.LogAsync(ex); // neu: await in catch Blockthrow;

}finally{

await service.CloseAsync(); // neu: await in finally Block}

Page 16: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

Digicomp 16

Roslyn – die .NET Compiler Platform

Page 17: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

17Digicomp Microsoft Evolution Day 2015

Was ist Roslyn?

Ein komplett neuer Compiler (C# und VB.NET)

Modular

Open Source

Diverse APIs für Compiler und Workspaces

Geeignet für komplett neue Tools, die auf dem Compiler aufsetzen

Domain specific Languages

Neue Tools für Compiler (analog Resharper)

Page 18: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

18Digicomp Microsoft Evolution Day 2015

Warum ein neuer Compiler?

Die alten Compiler waren in C++ geschrieben

«Eat your own dogfood» Mantra

Mehrere Compiler notwendig

Batch Compiler (csc.exe, vbc.exe)

Hintergrund-Compiler in Visual Studio (für Editor)

Snippet-Compiler für Immediate Window

Neue Anforderungen

Experimente mit Sprachen

Öffnung des API für 3rd party

Page 19: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

CalibriDigicomp Microsoft Evolution Day 2015

Compiler Pipeline

Page 20: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

20Digicomp Microsoft Evolution Day 2015

Syntax Tokens und Trivia

Parser generiert Tokens und Trivia

Tokens sind Sprachelemente

Schlüsselwörter

static, class, foreach, if, ...

Identifier

System, Console, WriteLine, x, ...

Operatoren: +, -, *, /, %

Punktuierung: . , ; ...

Trivia verändern das Programm nicht, müssen aber erhalten bleiben

Kommentare

Whitespace: Leerzeichen, \r\n, EOF

Page 21: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

21Digicomp Microsoft Evolution Day 2015

Arbeit mit Syntax Tree: Iteration

var tree = CSharpSyntaxTree.ParseText("class Foo { void Bar() {} }");var node = (CompilationUnitSyntax)tree.GetRoot();

foreach (var member in node.Members){

if (member.CSharpKind() == SyntaxKind.ClassDeclaration){

var @class = (ClassDeclarationSyntax)member;

foreach (var member2 in @class.Members){

if (member2.CSharpKind() == SyntaxKind.MethodDeclaration){

var method = (MethodDeclarationSyntax)member2;// do stuff

}}

}}

Page 22: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

22Digicomp Microsoft Evolution Day 2015

Verwendung von LINQ für Abfrage des SyntaxTree

var bars = from member in

node.Members.OfType<ClassDeclarationSyntax>()

from member2 in

member.Members.OfType<MethodDeclarationSyntax>()

where member2.Identifier.Text == "Bar"

select member2;

var result = bars.ToList();

Page 23: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

23Digicomp Microsoft Evolution Day 2015

Verwendung eines Visitors

class MyVisitor : CSharpSyntaxWalker

{

public override void VisitMethodDeclaration(MethodDeclarationSyntax node)

{

if (node.Identifier.Text == "Bar")

{

// do stuff

}

base.VisitMethodDeclaration(node);

}

}

new MyVisitor().Visit(node);

Page 24: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

24Digicomp Microsoft Evolution Day 2015

Analyzer und Code Fixes

Analyzer analysieren den SyntaxTree

Code Fixes reparieren bei Bedarf

Page 25: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

25Digicomp Microsoft Evolution Day 2015

Roslyn - Demo

Page 26: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

26Digicomp Microsoft Evolution Day 2015

Was ist (wirklich) neu in Visual Studio 2015?

Der Compiler!

Glühlampe: Live Code Analyse

Lambda Expressions in Watch Variablen

Cross-Platform Entwicklung und Debugging

Apache Cordova

Xamarin

Android

Verbesserungen der CodeLens

Page 27: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

27Digicomp Microsoft Evolution Day 2015

Was kommt als Nächstes?

Page 28: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

28Digicomp Microsoft Evolution Day 2015

(frühe) Ideen für C# 7 (Mads Torgersen)

Mehr Elemente aus der funktionalen Programmierung

Pattern Matching

Weniger Objekte kopieren: return ref, Zugriff auf Teile von Arrays, ...

Neue Syntax für Tuples: (int x, int y) Method (...) { .... return (1, 3); }

Sprachfeatures für State Machines

Null Referenzen verhindern durch Compiler Prüfungen

Absicht bekannt geben: public string ? LastName; // value could be null

Page 29: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

29Digicomp Microsoft Evolution Day 2015

F&A

Page 30: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

30Digicomp Microsoft Evolution Day 2015

Weiterführende Kurse

Neues in .NET 4.6 und Visual Studio 2015 (CN6)

1 Tag

CHF 800.–

Nächster Termin: 17.11.2015

https://www.digicomp.ch/weiterbildung/softwareentwicklung/microsoft-net/microsoft-net-framework/neues-in-net-4-6-und-visual-studio-2015

Programmieren mit C# (CSW)

3-5 Tage

CHF 3’250.–

https://www.digicomp.ch/weiterbildung/softwareentwicklung/microsoft-net/c/programmieren-mit-c-net-framework-4-6

Page 31: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ... · Digicomp Microsoft Evolution Day 2015 1 C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter Bornhauser Partner:

31Digicomp Microsoft Evolution Day 2015

Referenzen

http://www.github.com/dotnet/roslyn

https://channel9.msdn.com/Blogs/Seth-Juarez/Looking-Ahead-to-C-7-with-Mads-Torgersen