Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C# 8.0, vNow and vNext

3,091 views

Published on

Keynote der Dotnet Developer Conference 2017 zum Thema C#. Neben einer Historie der einzelnen Sprachfeatures liegt der Fokus danach auf den aktuellen Versionen (6.0, 7.0, 7.1,7.2) sowie der kommenden Sprachversion C# 8.0

Published in: Software
  • Be the first to comment

  • Be the first to like this

C# 8.0, vNow and vNext

  1. 1. Training - Beratung - Projektarbeit www.David-Tielke.de// vNow and vNext
  2. 2. Training - Beratung - Projektarbeit www.David-Tielke.de// Über mich: David Tielke • Freiberuflicher Trainer und Berater • Schwerpunkte • .NET / C# • Softwarequalität • Softwarearchitektur • ALM • Community
  3. 3. Training - Beratung - Projektarbeit www.David-Tielke.de//
  4. 4. Training - Beratung - Projektarbeit www.David-Tielke.de//
  5. 5. Training - Beratung - Projektarbeit www.David-Tielke.de// Willkommen
  6. 6. Training - Beratung - Projektarbeit www.David-Tielke.de// Geschichte von C# 1.0 bis 7.0
  7. 7. Training - Beratung - Projektarbeit www.David-Tielke.de// Sprachversionen von C# • C# 1.0 (2002) – Baseline • C# 1.2 (2003) – ECMA Anpassungen • C# 2.0 (2005) – Generics • C# 3.0 (2007) – LINQ • C# 4.0 (2010) – Dynamische Bindung • C# 5.0 (2012) – Asynchrone Methoden • C# 6.0 (2015) – Roslyn • C# 7.0, 7.1, 7.2 (2017) – Data & Performance
  8. 8. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 1.2 – Anpassungen ECMA Standard • #line hidden • XML-Kommentare als Multiline • Änderungen foreach-Schleife • Änderungen Properties - Anpassung an ECMA Standard für C#
  9. 9. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 2.0 - Generics • Generics • Partielle Typen • Anonyme Methoden • Nullbare Datentypen • Delegates • Statische Klassen
  10. 10. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 3.0 – Language Integrated Query • Var • Objekt- & Collection-Initializers • Autoproperties • Anonyme Datentypen • Erweiterungsmethoden • Lambdas • Expression-Trees
  11. 11. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 4.0 – Dynamisches Binding • dynamic • Benannte und optionale Argumente • Generische Co- und Contravarianz • Embedded Interop-Datentyp („NoPia“)
  12. 12. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 5.0 – Asynchrone Methoden • Async/Await • CallerInfo-Attribute
  13. 13. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 6.0 Language Improvements
  14. 14. Training - Beratung - Projektarbeit www.David-Tielke.de// Exception Filters static void Main(string[] args) { try { // ... } catch (Exception e) when (e.HResult == 4711) { // ... } }
  15. 15. Training - Beratung - Projektarbeit www.David-Tielke.de// Readonly Auto Properties & Initializer class Person { public int Id { get; } = -1; public string Name { get; set; } public Person(string name) { Name = name; } }
  16. 16. Training - Beratung - Projektarbeit www.David-Tielke.de// Expression Bodied Members class Messwert { public double ValueInWh { get; set; } public Messwert(double valueInWh) { ValueInWh = valueInWh; } public double ToKWh() => ValueInWh / 1000; }
  17. 17. Training - Beratung - Projektarbeit www.David-Tielke.de// Null Conditional Operator class Program { static void Main() { var name = GetName(); var länge = name?.Length ?? 0; Console.WriteLine(länge); } private static string GetName() { // ... } }
  18. 18. Training - Beratung - Projektarbeit www.David-Tielke.de// String Interpolation public static void Main() { var msg = $"Heute ist der {DateTime.Now:d}"; Console.WriteLine(msg); }
  19. 19. Training - Beratung - Projektarbeit www.David-Tielke.de// Nameof-Operator public void Log(string message) { if (message == null) { throw new ArgumentNullException(nameof(message)); } }
  20. 20. Training - Beratung - Projektarbeit www.David-Tielke.de// Using Static using static System.Console; using static System.Math; namespace CSharpSnippets { class Program { static void Main(string[] args) { var sqrt = Sqrt(25); WriteLine(sqrt); } } }
  21. 21. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 7.0 vNow
  22. 22. Training - Beratung - Projektarbeit www.David-Tielke.de// Out-Variables static void Main(string[] args) { // C# 6.0 int value; if (TryLoadValue(out value)) { // ... } // C# 7.0 if (TryLoadValue(out int value2)) { // ... } }
  23. 23. Training - Beratung - Projektarbeit www.David-Tielke.de// Pattern Matching (1) public void Log(object obj) { if (obj is null) // Constant pattern { throw new ArgumentNullException(nameof(obj)); } if (obj is string msg) // Type pattern { Console.WriteLine(msg); } if (obj is Person p && TrySerializeToJson(out string data, p)) { File.AppendAllText("log.txt", data); } }
  24. 24. Training - Beratung - Projektarbeit www.David-Tielke.de// Pattern Matching (2) public void Log(object obj) { switch (obj) { case null: throw new ArgumentNullException(nameof(obj)); case string msg: Console.WriteLine(msg); break; case Person p when TrySerializeToJson(out string data, p): File.AppendAllText("log.txt", data); break; } }
  25. 25. Training - Beratung - Projektarbeit www.David-Tielke.de// Tuples public static (bool success, double value) GetValueOperation() { var success = TryGetValue(out double value); return (success, value); } public static (int, string, int) GetPersonValues(Person p) => (p.Id, p.Name, p.Age); public static void Main() { var result = GetValueOperation(); Console.WriteLine(result.success ? result.value.ToString() : "n/a"); var person = new Person(1, "David",33); var (id, name, age) = GetPersonValues(person); Console.WriteLine($"id: {id} name: {name} age: {age}"); }
  26. 26. Training - Beratung - Projektarbeit www.David-Tielke.de// Local Functions public string Format(Person person) { (int id, string name, int age) Deconstruct(Person p) => (p.Id, p.Name, p.Age); var (id, name, age) = Deconstruct(person); return $"{id},{name},{age}"; }
  27. 27. Training - Beratung - Projektarbeit www.David-Tielke.de// Literal Improvements public static void Main() { var summe = 1_234_567; var binärZahl = 0b1001_1100_0111; var hexZahl = 0xFF_99_00; }
  28. 28. Training - Beratung - Projektarbeit www.David-Tielke.de// Ref Returns And Locals public ref int Find(int number, int[] numbers) { for (int i = 0; i < numbers.Length; i++) { if (numbers[i] == number) return ref numbers[i]; } throw new IndexOutOfRangeException($"{nameof(number)} not found"); } public void Main() { int[] array = {1, 15, -39, 0, 7, 14, -12}; ref int place = ref Find(7, array); place = 9; }
  29. 29. Training - Beratung - Projektarbeit www.David-Tielke.de// More Expression Bodied Members class Person { private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>(); private int id; public Person(string name) => names.TryAdd(id, name); ~Person() => names.TryRemove(id, out _); public string Name { get => names[id]; set => names[id] = value; } }
  30. 30. Training - Beratung - Projektarbeit www.David-Tielke.de// Throw Expressions (1) public string FindName(string name) { if(name == null) throw new ArgumentNullException(nameof(name)); var person = Persons.SingleOrDefault(p => p.Name == name); if (person == null) { throw new ArgumentException($"No person with name {name}"); } return Persons.Single(p => p.Name == name).Name; }
  31. 31. Training - Beratung - Projektarbeit www.David-Tielke.de// Throw Expressions (2) public List<Person> Persons { get; } = new List<Person>(); public string FindName(string name) => name is null ? throw new ArgumentNullException(nameof(name)) : Persons.SingleOrDefault(p => p.Name == name)?.Name ?? throw new ArgumentNullException(nameof(name), $"Keine Person mit Name {name}");
  32. 32. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 7.1 vNow++
  33. 33. Training - Beratung - Projektarbeit www.David-Tielke.de// Async Main static async Task Main(string[] args) { HttpClient client = new HttpClient(); string data = await client.GetStringAsync("http://david-tielke.de"); Console.WriteLine(data); }
  34. 34. Training - Beratung - Projektarbeit www.David-Tielke.de// Target-Type Default Literal public static void Main() { string name = default; } public TType Get<TType>() { return default; }
  35. 35. Training - Beratung - Projektarbeit www.David-Tielke.de// Infer Tuple Names public static void Main() { var person = new Person(1, "David", 33); var tuple = (person.Id, person.Name, person.Age); Console.WriteLine(tuple.Name); }
  36. 36. Training - Beratung - Projektarbeit www.David-Tielke.de// C# 7.2 vNow+=2
  37. 37. Training - Beratung - Projektarbeit www.David-Tielke.de// In Parameters public static void Foo(int number) { } public static void Foo(ref int number) { } public static void Foo(out int number) { } public static void Foo(in int number) { }
  38. 38. Training - Beratung - Projektarbeit www.David-Tielke.de// Ref Readonly Returns private static Point3D origin = new Point3D(); public static ref readonly Point3D Origin => ref origin;
  39. 39. Training - Beratung - Projektarbeit www.David-Tielke.de// Readonly Struct readonly public struct ReadonlyPoint3D { public ReadonlyPoint3D(double x, double y, double z) { this.X = x; this.Y = y; this.Z = z; } public double X { get; } public double Y { get; } public double Z { get; } private static readonly ReadonlyPoint3D origin = new ReadonlyPoint3D(); public static ref readonly ReadonlyPoint3D Origin => ref origin; }
  40. 40. Training - Beratung - Projektarbeit www.David-Tielke.de// C# vNext (8.0)
  41. 41. Training - Beratung - Projektarbeit www.David-Tielke.de// Stand C# 8.0 • Komplett transparent auf github • Releasedatum: Unklar • Umfang: Unklar² • Syntax: Unklar³
  42. 42. Training - Beratung - Projektarbeit www.David-Tielke.de// Nullable Reference Types (1) public void Foo() { int zahl1 = 0; int? zahl2 = null; Person p1 = null; // Compiler Warnung Person? p2 = null; // Keine Compiler Warnung }
  43. 43. Training - Beratung - Projektarbeit www.David-Tielke.de// Nullable Reference Types (2) public void Foo() { Person? p = new Person(...); Console.WriteLine(p.Vorname); // Compiler Warnung if(p != null) { Console.WriteLine(p.Vorname); } }
  44. 44. Training - Beratung - Projektarbeit www.David-Tielke.de// Nullable Reference Types (3) public void Foo() { Person? p = Method(...); Console.WriteLine(p!.Vorname); }
  45. 45. Training - Beratung - Projektarbeit www.David-Tielke.de// Async Streams (1) async IAsyncEnumerable<T> MethodName()
  46. 46. Training - Beratung - Projektarbeit www.David-Tielke.de// Async Streams (2) foreach await (string s in asyncStream)
  47. 47. Training - Beratung - Projektarbeit www.David-Tielke.de// Extension Everything extension PersonExtension extends Person { // Properties // Constructors // Methods // Fields // Events }
  48. 48. Training - Beratung - Projektarbeit www.David-Tielke.de// Method Contracts – Leider nicht… public int Add(Person personToAdd) requires personToAdd != null ensures return > 0 { // ... }
  49. 49. Training - Beratung - Projektarbeit www.David-Tielke.de// Dafür aber: Default Methoden in Interfaces interface IA { void M() { WriteLine("IA.M"); } }
  50. 50. Training - Beratung - Projektarbeit www.David-Tielke.de// Die Zukunft
  51. 51. Training - Beratung - Projektarbeit www.David-Tielke.de// C# ändert sich
  52. 52. Training - Beratung - Projektarbeit www.David-Tielke.de// Fazit für die Zukunft .NET passt sich der Zukunft an C# passt sich der Zukunft an C#, .NET und Visual Studio beste Plattform
  53. 53. Training - Beratung - Projektarbeit www.David-Tielke.de// Kontakt • Blog: www.David-Tielke.de • Email: mail@david-tielke.de • Twitter: davidtielke • XING

×