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.
What’s New In C# 6
Paulo Morgado
http://netponto.org9ª Reunião Presencial - Porto - 16/01/2016
Paulo Morgado
Agenda
• Improvements in Auto-Properties
• Expression Bodied Function Members
• The 'using static' Directive
• Null-Condit...
Improvements in Auto-Properties
Initializers for Auto-Properties
public class Person
{
private string firstName = "Jane"
p...
Improvements in Auto-Properties
Initializers for Auto-Properties
public class Person
{
public string FirstName { get; set;...
Improvements in Auto-Properties
Read-Only Auto-Properties
public class Person
{
private readonly string firstName = "Jane"...
Improvements in Auto-Properties
Read-Only Auto-Properties
public class Person
{
public string FirstName { get; } = "Jane";...
Expression Bodied Function Members
Expression Bodied Method-Like Function Members
public Point Move(int dx, int dy)
{
retu...
Expression Bodied Function Members
Expression Bodied Method-Like Function Members
public Point Move(int dx, int dy) => new...
Expression Bodied Function Members
Expression Bodied Property-Like Function Members
public string Name
{
get { return Firs...
Expression Bodied Function Members
Expression Bodied Property-Like Function Members
public string Name => First + " " + La...
The 'using static' Directive
using System;
class Program
{
static void Main()
{
Console.WriteLine(Math.Sqrt(3 * 3 + 4 * 4)...
The 'using static' Directive
using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class P...
The 'using static' Directive
Extension Methods
using static System.Linq.Enumerable; // The type, not the namespace
class P...
Null-Conditional Operator
Property and Method Invocation
int? nullable = (people != null) ? new int?(people.Length) : null...
Null-Conditional Operator
Property and Method Invocation
int? length = people?.Length; // null if people is null
Person fi...
Null-Conditional Operator
Delegate Invocation
var handler = PropertyChanged;
if (handler != null)
{
handler(this, args);
}
Null-Conditional Operator
Delegate Invocation
PropertyChanged?.Invoke(this, args);
C# 6
String Interpolation
string.Format("{0} is {1} year{{s}} old.", p.Name, p.Age)
String Interpolation
$"{p.Name} tem {p.Age} ano{{s}}."
$"{p.Name,20} tem {p.Age:D3} ano{{s}}."
$"{p.Name} tem {p.Age} ano{...
String Interpolation
Formattable Strings
IFormattable christmas = $"{new DateTime(2015, 12, 25):f}";
var christamasText =
...
String Interpolation
Formattable Strings
FormattableStringFactory.Create("{0:f}", new DateTime(2015, 12, 25))
public abstr...
String Interpolation
Formattable Strings
FormattableString christmas = $"{new DateTime(2015, 12, 25):f}";
var christamasTe...
String Interpolation
Formattable Strings
public static IDbCommand CreateCommand(
this IDbConnection connection,
Formattabl...
'nameof' Expressions
void M1(string x)
{
if (x == null) throw new ArgumentNullException("x");
var s = "ZipCode";
}
'nameof' Expressions
void M1(string x)
{
if (x == null) throw new ArgumentNullException(nameof(x));
var s = nameof(Person....
'nameof' Expressions
Source Code vs. Metadata
using S = System.String;
void M<T>(S s)
{
var s1 = nameof(T);
var s2 = nameo...
Collection Initializers
'Add' Extension Methods
public class C<T> : IEnumerable<T>
{
// ...
}
public static class Cx
{
pub...
Collection Initializers
'Add' Extension Methods
public class C<T> : IEnumerable<T>
{
// ...
}
public static class Cx
{
pub...
Index Initializers
var numbers = new Dictionary<int, string>();
numbers[7] = "sete";
numbers[9] = "nove";
numbers[13] = "t...
Index Initializers
var numbers = new Dictionary<int, string>
{
[7] = "sete",
[9] = "nove",
[13] = "treze"
};
C# 6
Exception Filters
try
{
//...
}
catch (SqlException ex) when (ex.Number == 2)
{
// ...
}
catch (SqlException ex)
{
// ...
...
'await' in 'catch' and 'finally' blocks
async Task M()
{
Resource res = null;
Exception ex = null;
try
{
res = await Resou...
'await' in 'catch' and 'finally' blocks
async Task M()
{
Resource res = null;
try
{
res = await Resource.OpenAsync();
}
ca...
C# Interactive
C# 6
Citação...
“.NET é bom, e Java é ruim...”
<Nome do Autor>
Referências
dotnet/roslyn, New Language Features in C# 6
– https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-...
Obrigado!
Paulo Morgado
http://PauloMorgado.NET/
https://twitter.com/PauloMorgado
http://netponto.org/membro/paulo-morgado...
Próximas reuniões presenciais
23/01/2016 – Janeiro – Lisboa
20/02/2016 – Fevereiro – Braga
27/02/2016 – Fevereiro – Lisboa...
Patrocinadores “GOLD”
Patrocinadores “Silver”
Patrocinadores “Bronze”
http://bit.ly/netponto-aval-po-9
* Para quem não puder preencher durante a reunião,
iremos enviar um email com o link à ta...
Upcoming SlideShare
Loading in …5
×

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

1,199 views

Published on

A round about what's presented at the NetPonto usergroup meeting at the great Porto area.

Published in: Software
  • Be the first to comment

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

  1. 1. What’s New In C# 6 Paulo Morgado http://netponto.org9ª Reunião Presencial - Porto - 16/01/2016
  2. 2. Paulo Morgado
  3. 3. 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
  4. 4. 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; } } }
  5. 5. 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
  6. 6. 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; } }
  7. 7. 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
  8. 8. 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; }
  9. 9. 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
  10. 10. 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); } }
  11. 11. 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
  12. 12. 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); } }
  13. 13. 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
  14. 14. 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
  15. 15. Null-Conditional Operator Property 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;
  16. 16. 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? first = people?[0].Orders.Count(); C# 6
  17. 17. Null-Conditional Operator Delegate Invocation var handler = PropertyChanged; if (handler != null) { handler(this, args); }
  18. 18. Null-Conditional Operator Delegate Invocation PropertyChanged?.Invoke(this, args); C# 6
  19. 19. String Interpolation string.Format("{0} is {1} year{{s}} old.", p.Name, p.Age)
  20. 20. 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
  21. 21. String Interpolation Formattable Strings IFormattable christmas = $"{new DateTime(2015, 12, 25):f}"; var christamasText = christmas.ToString(string.Empty, new CultureInfo("pt-PT")); C# 6
  22. 22. 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); } .NET 4.6 or highier C# 6
  23. 23. String Interpolation Formattable Strings FormattableString christmas = $"{new DateTime(2015, 12, 25):f}"; var christamasText = christmas.ToString(new CultureInfo("pt-PT")); C# 6
  24. 24. 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 = "Luis"; IDbConnection cnn = new SqlConnection(); var cmd = cnn.CreateCommand( $"insert into test (id, nome) values({id}, {nome})"); cmd.ExecuteNonQuery(); C# 6
  25. 25. 'nameof' Expressions void M1(string x) { if (x == null) throw new ArgumentNullException("x"); var s = "ZipCode"; }
  26. 26. 'nameof' Expressions void M1(string x) { if (x == null) throw new ArgumentNullException(nameof(x)); var s = nameof(Person.Address.ZipCode); } C# 6
  27. 27. '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
  28. 28. 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);
  29. 29. 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
  30. 30. Index Initializers var numbers = new Dictionary<int, string>(); numbers[7] = "sete"; numbers[9] = "nove"; numbers[13] = "treze";
  31. 31. Index Initializers var numbers = new Dictionary<int, string> { [7] = "sete", [9] = "nove", [13] = "treze" }; C# 6
  32. 32. 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
  33. 33. '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(); }
  34. 34. '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
  35. 35. C# Interactive C# 6
  36. 36. Citação... “.NET é bom, e Java é ruim...” <Nome do Autor>
  37. 37. Referências dotnet/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/
  38. 38. Obrigado! 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
  39. 39. Próximas reuniões presenciais 23/01/2016 – Janeiro – Lisboa 20/02/2016 – Fevereiro – Braga 27/02/2016 – Fevereiro – Lisboa 19/03/2016 – Março – Lisboa 26/03/2016 – Março – Porto Reserva estes dias na agenda! :)
  40. 40. Patrocinadores “GOLD”
  41. 41. Patrocinadores “Silver”
  42. 42. Patrocinadores “Bronze”
  43. 43. 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

×