43

Click here to load reader

What's new in C# 6 - NetPonto Porto 20160116

Embed Size (px)

Citation preview

Page 1: What's new in C# 6  - NetPonto Porto 20160116

What’s New In C# 6Paulo Morgado

http://netponto.org9ª Reunião Presencial - Porto - 16/01/2016

Page 2: What's new in C# 6  - NetPonto Porto 20160116

Paulo Morgado

Page 3: What's new in C# 6  - NetPonto Porto 20160116

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

Page 4: What's new in C# 6  - NetPonto Porto 20160116

Improvements in Auto-PropertiesInitializers 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; } }}

Page 5: What's new in C# 6  - NetPonto Porto 20160116

Improvements in Auto-PropertiesInitializers for Auto-Properties

public class Person{ public string FirstName { get; set; } = "Jane"; public string LastName { get; set; } = "Doe";}

C# 6

Page 6: What's new in C# 6  - NetPonto Porto 20160116

Improvements in Auto-PropertiesRead-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; }}

Page 7: What's new in C# 6  - NetPonto Porto 20160116

Improvements in Auto-PropertiesRead-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

Page 8: What's new in C# 6  - NetPonto Porto 20160116

Expression Bodied Function MembersExpression 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;}

Page 9: What's new in C# 6  - NetPonto Porto 20160116

Expression Bodied Function MembersExpression 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

Page 10: What's new in C# 6  - NetPonto Porto 20160116

Expression Bodied Function MembersExpression Bodied Property-Like Function Members

public string Name{ get { return First + " " + Last; }} public Person this[long id]{ get { return store.LookupPerson(id); }}

Page 11: What's new in C# 6  - NetPonto Porto 20160116

Expression Bodied Function MembersExpression Bodied Property-Like Function Members

public string Name => First + " " + Last; public Person this[long id] => store.LookupPerson(id);

C# 6

Page 12: What's new in C# 6  - NetPonto Porto 20160116

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); }}

Page 13: What's new in C# 6  - NetPonto Porto 20160116

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

Page 14: What's new in C# 6  - NetPonto Porto 20160116

The 'using static' DirectiveExtension 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

Page 15: What's new in C# 6  - NetPonto Porto 20160116

Null-Conditional OperatorProperty and Method Invocation

int? nullable = (people != null) ? new int?(people.Length) : null;Person person = (people != null) ? people[0] : null; int? first = (people != null) ? people[0].Orders.Count() : (int?)null;

Page 16: What's new in C# 6  - NetPonto Porto 20160116

Null-Conditional OperatorProperty and Method Invocation

int? length = people?.Length; // null if people is nullPerson first = people?[0]; // null if people is null int length = people?.Length ?? 0; // 0 if people is null int? first = people?[0].Orders.Count();

C# 6

Page 17: What's new in C# 6  - NetPonto Porto 20160116

Null-Conditional OperatorDelegate Invocation

var handler = PropertyChanged;if (handler != null){ handler(this, args);}

Page 18: What's new in C# 6  - NetPonto Porto 20160116

Null-Conditional OperatorDelegate Invocation

PropertyChanged?.Invoke(this, args);

C# 6

Page 19: What's new in C# 6  - NetPonto Porto 20160116

String Interpolation

string.Format("{0} is {1} year{{s}} old.", p.Name, p.Age)

Page 20: What's new in C# 6  - NetPonto Porto 20160116

String Interpolation

$"{p.Name} tem {p.Age} ano{{s}}." $"{p.Name,20} tem {p.Age:D3} ano{{s}}." $"{p.Name} tem {p.Age} ano{(p.Age == 1 ? "" : "s")}."

C# 6

Page 21: What's new in C# 6  - NetPonto Porto 20160116

String InterpolationFormattable Strings

IFormattable christmas = $"{new DateTime(2015, 12, 25):f}";var christamasText = christmas.ToString(string.Empty, new CultureInfo("pt-PT"));

C# 6

Page 22: What's new in C# 6  - NetPonto Porto 20160116

String InterpolationFormattable 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);}

.NET 4.6 or highier

C# 6

Page 23: What's new in C# 6  - NetPonto Porto 20160116

String InterpolationFormattable Strings

FormattableString christmas = $"{new DateTime(2015, 12, 25):f}";var christamasText = christmas.ToString(new CultureInfo("pt-PT"));

C# 6

Page 24: What's new in C# 6  - NetPonto Porto 20160116

String InterpolationFormattable 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 = "Luis";IDbConnection cnn = new SqlConnection();var cmd = cnn.CreateCommand( $"insert into test (id, nome) values({id}, {nome})");cmd.ExecuteNonQuery();

C# 6

Page 25: What's new in C# 6  - NetPonto Porto 20160116

'nameof' Expressions

void M1(string x){ if (x == null) throw new ArgumentNullException("x"); var s = "ZipCode";}

Page 26: What's new in C# 6  - NetPonto Porto 20160116

'nameof' Expressions

void M1(string x){ if (x == null) throw new ArgumentNullException(nameof(x)); var s = nameof(Person.Address.ZipCode);}

C# 6

Page 27: What's new in C# 6  - NetPonto Porto 20160116

'nameof' ExpressionsSource Code vs. Metadatausing 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

Page 28: What's new in C# 6  - NetPonto Porto 20160116

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

Page 29: What's new in C# 6  - NetPonto Porto 20160116

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

Page 30: What's new in C# 6  - NetPonto Porto 20160116

Index Initializers

var numbers = new Dictionary<int, string>();numbers[7] = "sete";numbers[9] = "nove";numbers[13] = "treze";

Page 31: What's new in C# 6  - NetPonto Porto 20160116

Index Initializers

var numbers = new Dictionary<int, string>{ [7] = "sete", [9] = "nove", [13] = "treze"};

C# 6

Page 32: What's new in C# 6  - NetPonto Porto 20160116

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

Page 33: What's new in C# 6  - NetPonto Porto 20160116

'await' in 'catch' and 'finally' blocksasync 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();}

Page 34: What's new in C# 6  - NetPonto Porto 20160116

'await' in 'catch' and 'finally' blocksasync 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

Page 35: What's new in C# 6  - NetPonto Porto 20160116

C# Interactive

C# 6

Page 36: What's new in C# 6  - NetPonto Porto 20160116

Citação...

“.NET é bom, e Java é ruim...”<Nome do Autor>

Page 37: What's new in C# 6  - NetPonto Porto 20160116

Referênciasdotnet/roslyn, New Language Features in C# 6

– https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

simple talk, What's New in C# 6– https://www.simple-talk.com/dotnet/.net-framework/whats-new-in-c-6/

Revista PROGRAMAR, As Novidades Do C# 6– http://www.revista-programar.info/artigos/as-novidades-do-c-sharp-6/

Page 38: What's new in C# 6  - NetPonto Porto 20160116

Obrigado!

Paulo Morgadohttp://PauloMorgado.NET/https://twitter.com/PauloMorgadohttp://netponto.org/membro/paulo-morgado/https://www.facebook.com/paulo.morgadohttps://www.linkedin.com/in/PauloMorgadohttp://www.revista-programar.info/author/pmorgado/https://www.simple-talk.com/author/paulo-morgado/http://www.slideshare.net/PauloJorgeMorgadohttps://docs.com/paulo-morgado

Page 39: What's new in C# 6  - NetPonto Porto 20160116

Próximas reuniões presenciais

23/01/2016 – Janeiro – Lisboa20/02/2016 – Fevereiro – Braga27/02/2016 – Fevereiro – Lisboa19/03/2016 – Março – Lisboa26/03/2016 – Março – Porto

Reserva estes dias na agenda! :)

Page 40: What's new in C# 6  - NetPonto Porto 20160116

Patrocinadores “GOLD”

Page 41: What's new in C# 6  - NetPonto Porto 20160116

Patrocinadores “Silver”

Page 42: What's new in C# 6  - NetPonto Porto 20160116

Patrocinadores “Bronze”

Page 43: What's new in C# 6  - NetPonto Porto 20160116

http://bit.ly/netponto-aval-po-9

* Para quem não puder preencher durante a reunião, iremos enviar um email com o link à tarde