Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What's New In C# 6

What's New In C# 6

A lap around what's new in C# 6.

Paulo Morgado

May 21, 2016
Tweet

Other Decks in Programming

Transcript

  1. THANK YOU TO OUR TEAM ANDRÉ BATISTA ANDRÉ MELANCIA ANDRÉ

    VALA ANTÓNIO LOURENÇO BRUNO LOPES CLÁUDIO SILVA NIKO NEUGEBAUER RUI REIS RICARDO CABRAL NUNO CANCELO PAULO MATOS PEDRO SIMÕES SANDRA MORGADO SANDRO PEREIRA RUI BASTOS NUNO ÁRIAS SILVA
  2. Agenda • Improvements in Auto-Properties • Expression Bodied Function Members

    • The 'using static' Directive • Null-Conditional Operator • String Interpolation • 'nameof' Expressions • 'Add' Extension Methods in Collection Initializers • Index Initializers • Exception Filters • 'await' in 'catch' and 'finally' blocks • C# Interactive
  3. Improvements in Auto-Properties Initializers for Auto-Properties public class Person {

    private string firstName = "Jane" private string lastName = "Doe"; public string FirstName { get { return firstName; } set { firstName = value; } } public string LastName { get { return lastName; } set { lastName = value; } } }
  4. Improvements in Auto-Properties Initializers for Auto-Properties public class Person {

    public string FirstName { get; set; } = "Jane"; public string LastName { get; set; } = "Doe"; } C# 6
  5. Improvements in Auto-Properties Read-Only Auto-Properties public class Person { private

    readonly string firstName = "Jane"; private readonly string lastName = "Doe"; public string FirstName { get { return firstName; } } public string LastName { get { return lastName; } } // ... public Person(string first, string last) { firstName = first; lastName = last; } }
  6. Improvements in Auto-Properties Read-Only Auto-Properties public class Person { public

    string FirstName { get; } = "Jane"; public string LastName { get; } = "Doe"; // ... public Person(string first, string last) { FirstName = first; LastName = last; } } C# 6
  7. Expression Bodied Function Members Expression Bodied Method-Like Function Members public

    Point Move(int dx, int dy) { return new Point(x + dx, y + dy); } public static Complex operator +(Complex a, Complex b) { return a.Add(b); } public static implicit operator string(Person p) { return p.First + " " + p.Last; }
  8. Expression Bodied Function Members Expression Bodied Method-Like Function Members public

    Point Move(int dx, int dy) => new Point(x + dx, y + dy); public static Complex operator +(Complex a, Complex b) => a.Add(b); public static implicit operator string (Person p) => p.First + " " + p.Last; C# 6
  9. Expression Bodied Function Members Expression Bodied Property-Like Function Members public

    string Name { get { return First + " " + Last; } } public Person this[long id] { get { return store.LookupPerson(id); } }
  10. Expression Bodied Function Members Expression Bodied Property-Like Function Members public

    string Name => First + " " + Last; public Person this[long id] => store.LookupPerson(id); C# 6
  11. The 'using static' Directive using System; class Program { static

    void Main() { Console.WriteLine(Math.Sqrt(3 * 3 + 4 * 4)); Console.WriteLine(DayOfWeek.Friday - DayOfWeek.Monday); } }
  12. The 'using static' Directive using static System.Console; using static System.Math;

    using static System.DayOfWeek; class Program { static void Main() { WriteLine(Sqrt(3 * 3 + 4 * 4)); WriteLine(Friday - Monday); } } C# 6
  13. The 'using static' Directive Extension Methods using static System.Linq.Enumerable; //

    The type, not the namespace class Program { static void Main() { var range = Range(5, 17); // Ok: not extension var odd = Where(range, i => i % 2 == 1); // Error, not in scope var even = range.Where(i => i % 2 == 0); // Ok } } C# 6
  14. Null-Conditional Operator Property and Method Invocation int? nullable = (people

    != null) ? new int?(people.Length) : null; Person first = (people != null) ? people[0] : null; int? firstCount = (people != null) ? people[0].Orders.Count() : (int?)null; int firstCount = (people != null) ? people[0].Orders.Count() : 0;
  15. Null-Conditional Operator Property and Method Invocation int? length = people?.Length;

    // null if people is null Person first = people?[0]; // null if people is null int length = people?.Length ?? 0; // 0 if people is null int? firstCount = people?[0].Orders.Count(); C# 6
  16. String Interpolation Formattable Strings IFormattable christmas = $"{new DateTime(2015, 12,

    25):f}"; var christamasText = christmas.ToString(string.Empty, new CultureInfo("pt-PT")); C# 6
  17. String Interpolation Formattable Strings FormattableStringFactory.Create("{0:f}", new DateTime(2015, 12, 25)) public

    abstract class FormattableString : IFormattable { protected FormattableString(); public abstract int ArgumentCount { get; } public abstract string Format { get; } public static string Invariant(FormattableString formattable); public abstract object GetArgument(int index); public abstract object[] GetArguments(); public override string ToString(); public abstract string ToString(IFormatProvider formatProvider); } C# 6
  18. String Interpolation Formattable Strings FormattableString christmas = $"{new DateTime(2015, 12,

    25):f}"; var christamasText = christmas.ToString(new CultureInfo("pt-PT")); C# 6
  19. String Interpolation Formattable Strings public static IDbCommand CreateCommand( this IDbConnection

    connection, FormattableString commandText) { var command = connection.CreateCommand(); command.CommandType = CommandType.Text; if (commandText.ArgumentCount > 0) { var commandTextArguments = new string[commandText.ArgumentCount]; for (var i = 0; i < commandText.ArgumentCount; i++) { commandTextArguments[i] = "@p" + i.ToString(); var p = command.CreateParameter(); p.ParameterName = commandTextArguments[i]; p.Value = commandText.GetArgument(i); command.Parameters.Add(p); } command.CommandText = string.Format(CultureInfo.InvariantCulture, commandText.Format, commandTextArguments); } else { command.CommandText = commandText.Format; } return command; } var id = 10; var nome = “Paulo"; IDbConnection cnn = new SqlConnection(); var cmd = cnn.CreateCommand( $"insert into test (id, nome) values({id}, {nome})"); cmd.ExecuteNonQuery(); C# 6
  20. 'nameof' Expressions void M1(string x) { if (x == null)

    throw new ArgumentNullException("x"); var s = "ZipCode"; }
  21. 'nameof' Expressions void M1(string x) { if (x == null)

    throw new ArgumentNullException(nameof(x)); var s = nameof(Person.Address.ZipCode); } C# 6
  22. 'nameof' Expressions Source Code vs. Metadata using S = System.String;

    void M<T>(S s) { var s1 = nameof(T); var s2 = nameof(S); } using S = System.String; void M<T>(S s) { var s1 = "T"; var s2 = "S"; } C# 6
  23. Collection Initializers 'Add' Extension Methods public class C<T> : IEnumerable<T>

    { // ... } public static class Cx { public static void Add<T>(this C<T> c, T i) { // ... } } var cs = new C<int>(); cs.Add(1); cs.Add(2); cs.Add(3);
  24. Collection Initializers 'Add' Extension Methods public class C<T> : IEnumerable<T>

    { // ... } public static class Cx { public static void Add<T>(this C<T> c, T i) { // ... } } var cs = new C<int> { 1, 2, 3 }; C# 6
  25. Index Initializers var numbers = new Dictionary<int, string>(); numbers[7] =

    "seven"; numbers[9] = "nine"; numbers[13] = "thirteen";
  26. Index Initializers var numbers = new Dictionary<int, string> { [7]

    = "seven", [9] = "nine", [13] = "thirteen" }; C# 6
  27. Exception Filters try { //... } catch (SqlException ex) when

    (ex.Number == 2) { // ... } catch (SqlException ex) { // ... } Exectued in the context of the throw, not the catch. C# 6
  28. 'await' in 'catch' and 'finally' blocks async Task M() {

    Resource res = null; Exception ex = null; try { res = await Resource.OpenAsync(); } catch (ResourceException e) { ex = e; } if (ex != null) await Resource.LogAsync(res, e); if (res != null) await res.CloseAsync(); }
  29. 'await' in 'catch' and 'finally' blocks async Task M() {

    Resource res = null; try { res = await Resource.OpenAsync(); } catch (ResourceException e) { await Resource.LogAsync(res, e); } finally { if (res != null) await res.CloseAsync(); } } C# 6
  30. Thank You! Paulo Morgado http://PauloMorgado.NET/ https://twitter.com/PauloMorgado http://netponto.org/membro/paulo-morgado/ https://www.facebook.com/paulo.morgado https://www.linkedin.com/in/PauloMorgado http://www.revista-programar.info/author/pmorgado/

    https://www.simple-talk.com/author/paulo-morgado/ http://www.slideshare.net/PauloJorgeMorgado https://docs.com/paulo-morgado http://www.fca.pt/pt/catalogo-pesquisa/?filtros=0&pesquisa=paulo+morgado