c# 6.0 und die .net compiler platform (roslyn) hans peter...
TRANSCRIPT
![Page 1: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/1.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/2.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/3.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/4.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/5.jpg)
Digicomp 5
C# 6.0 Demo
![Page 6: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/6.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/7.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/8.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/9.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/10.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/11.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/12.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/13.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/14.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/15.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/16.jpg)
Digicomp 16
Roslyn – die .NET Compiler Platform
![Page 17: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/17.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/18.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/19.jpg)
CalibriDigicomp Microsoft Evolution Day 2015
Compiler Pipeline
![Page 20: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/20.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/21.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/22.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/23.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/24.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/25.jpg)
25Digicomp Microsoft Evolution Day 2015
Roslyn - Demo
![Page 26: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/26.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/27.jpg)
27Digicomp Microsoft Evolution Day 2015
Was kommt als Nächstes?
![Page 28: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/28.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/29.jpg)
29Digicomp Microsoft Evolution Day 2015
F&A
![Page 30: C# 6.0 und die .NET Compiler Platform (Roslyn) Hans Peter ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/30.jpg)
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 ...digiblog.s3-eu-central-1.amazonaws.com/app/... · Digicomp Microsoft Evolution Day 2015 3 Referent: Hans Peter Bornhauser](https://reader033.vdocument.in/reader033/viewer/2022042315/5f039e0b7e708231d409efc3/html5/thumbnails/31.jpg)
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