Upload
paulo-morgado
View
572
Download
0
Embed Size (px)
Citation preview
TUGA IT 2016LISBON, PORTUGAL
THANK YOU TO OUR SPONSORS
THANK YOU TO OUR TEAM
ANDRÉ BATISTA ANDRÉ MELANCIA ANDRÉ VALA ANTÓNIO LOURENÇO BRUNO LOPES CLÁUDIO SILVA
NIKO NEUGEBAUER
RUI REISRICARDO CABRAL
NUNO CANCELO PAULO MATOS PEDRO SIMÕES
SANDRA MORGADO SANDRO PEREIRARUI BASTOS
NUNO ÁRIAS SILVA
What’s New In C# 6
Paulo Morgado
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
Improvements in Auto-PropertiesInitializers for Auto-Propertiespublic 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; } }}
Improvements in Auto-PropertiesInitializers for Auto-Propertiespublic class Person{ public string FirstName { get; set; } = "Jane"; public string LastName { get; set; } = "Doe";}
C# 6
Improvements in Auto-PropertiesRead-Only Auto-Propertiespublic 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; }}
Improvements in Auto-PropertiesRead-Only Auto-Propertiespublic class Person{ public string FirstName { get; } = "Jane"; public string LastName { get; } = "Doe";
// ...
public Person(string first, string last) { FirstName = first; LastName = last; }} C# 6
Expression Bodied Function MembersExpression Bodied Method-Like Function Memberspublic 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;}
Expression Bodied Function MembersExpression Bodied Method-Like Function Memberspublic 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
Expression Bodied Function MembersExpression Bodied Property-Like Function Memberspublic string Name{ get { return First + " " + Last; }} public Person this[long id]{ get { return store.LookupPerson(id); }}
Expression Bodied Function MembersExpression Bodied Property-Like Function Memberspublic string Name => First + " " + Last; public Person this[long id] => store.LookupPerson(id);
C# 6
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); }}
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
The 'using static' DirectiveExtension Methodsusing 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
Null-Conditional OperatorProperty and Method Invocationint? 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;
Null-Conditional OperatorProperty and Method Invocationint? 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? firstCount = people?[0].Orders.Count();
C# 6
Null-Conditional OperatorDelegate Invocationvar handler = PropertyChanged;if (handler != null){ handler(this, args);}
Null-Conditional OperatorDelegate InvocationPropertyChanged?.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{(p.Age == 1 ? "" : "s")}."
C# 6
String InterpolationFormattable StringsIFormattable christmas = $"{new DateTime(2015, 12, 25):f}";var christamasText = christmas.ToString(string.Empty, new CultureInfo("pt-PT"));
C# 6
String InterpolationFormattable StringsFormattableStringFactory.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
String InterpolationFormattable StringsFormattableString christmas = $"{new DateTime(2015, 12, 25):f}";var christamasText = christmas.ToString(new CultureInfo("pt-PT"));
C# 6
String InterpolationFormattable Stringspublic 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
'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.Address.ZipCode);}
C# 6
'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
Collection Initializers'Add' Extension Methodspublic 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);
Collection Initializers'Add' Extension Methodspublic 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
Index Initializers
var numbers = new Dictionary<int, string>();numbers[7] = "seven";numbers[9] = "nine";numbers[13] = "thirteen";
Index Initializers
var numbers = new Dictionary<int, string>{ [7] = "seven", [9] = "nine", [13] = "thirteen"};
C# 6
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
'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();}
'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
C# 6C# Interactive
References
dotnet/roslyn, New Language Features in C# 6• https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6
References
simple talk, What's New in C# 6• https://www.simple-talk.com/dotnet/.net-framework/whats-new-in-c-6/
References
Revista PROGRAMAR, As Novidades Do C# 6• http://www.revista-programar.info/artigos/as-novidades-do-c-sharp-6/
References
C# 6 - Programação com Produtividade • http://www.fca.pt/pt/catalogo/ebooks/informatica/programacao/c-6-programacao-com-pro
dutividade/
Thank You!
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-morgadohttp://www.fca.pt/pt/catalogo-pesquisa/?filtros=0&pesquisa=paulo+morgado
THANK YOU TO OUR SPONSORS