what's new in c# 6 - netponto porto 20160116
TRANSCRIPT
![Page 1: What's new in C# 6 - NetPonto Porto 20160116](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/1.jpg)
What’s New In C# 6Paulo Morgado
http://netponto.org9ª Reunião Presencial - Porto - 16/01/2016
![Page 3: What's new in C# 6 - NetPonto Porto 20160116](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/3.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/4.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/5.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/6.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/7.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/8.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/9.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/10.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/11.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/12.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/13.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/14.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/15.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/16.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/17.jpg)
Null-Conditional OperatorDelegate Invocation
var handler = PropertyChanged;if (handler != null){ handler(this, args);}
![Page 18: What's new in C# 6 - NetPonto Porto 20160116](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/18.jpg)
Null-Conditional OperatorDelegate Invocation
PropertyChanged?.Invoke(this, args);
C# 6
![Page 20: What's new in C# 6 - NetPonto Porto 20160116](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/20.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/21.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/22.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/23.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/24.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/25.jpg)
'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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/26.jpg)
'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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/27.jpg)
'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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/28.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/29.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/30.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/31.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/32.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/33.jpg)
'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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/34.jpg)
'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 37: What's new in C# 6 - NetPonto Porto 20160116](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/37.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/38.jpg)
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](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/39.jpg)
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 43: What's new in C# 6 - NetPonto Porto 20160116](https://reader038.vdocuments.us/reader038/viewer/2022102323/58f3151d1a28abfb2a8b4585/html5/thumbnails/43.jpg)
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