piątek, 3 kwietnia 2015

[C#|Visual Studio] C# 6.0 - co nowego ?

Microsoft regularnie co 2 - 3 lata wypuszcza nam nową wersję C#. Dotychczas wyglądało to tak:
2002: C# 1.0
2005: C# 2.0 (generyki)
2007: C# 3.0 (LINQ)
2010: C# 4.0 (dynamic)
2012: C# 5.0 -  (async)

Mamy 2015 rok i wiemy już mniej więcej, czego możemy się spodziewać po nowej wersji C#. Poniżej wybrane nowe funkcjonalności, które będą dostępne w Visual Studio 2015:

Auto-Property Initalizers


public class User
{
    public Guid Id { get; } = Guid.NewGuid();
}


Już wcześniej pozbawiono nas konieczności definiowania backing fields, teraz dodano możliwość automatycznego inicjalizowania danych.

Dictionary Initializers

Dictionary<string, User> _defaultUsers = new Dictionary<string, User>(){

    {"admin", new User("admin")},
    {"guest", new User("guest")}

}


Nowy, inny sposób:


Dictionary<string, User> _defaultUsers = new Dictionary<string, User>(){

    ["admin"] = new User("admin")},
    ["guest"] = new User("guest")}

}

Pierwszy sposób (stary) to seria wywołań metody Add, drugi to seria odwołań przez indekser.

Kolejna zmiana jest taka, że paramsy (słowo kluczowe params) mogą być jako IEnumerable<T>, nie muszą być tablicą T.

public int Sum(params IEnumerable<int> numbers){
    return numbers.Sum(n => n);
}

Mamy nowe literale: bitowy (0b1100) oraz poprawiający czytelność (1_000_000_000).

Wywoływanie statycznych metod:

W C# 6 można wywoływać statyczne metody bez podawania nazwy klasy, jeżeli typ jest statyczny i załączymy odpowiedni using.


using System.Console;

public static void Main(){
    Write("Writted without type specification");
}


W przypadku konfliktów zawsze wygra metoda statyczna (podobna interpretacja jak w przypadku extension methods).

Conditional access operator:


var name = action.?Method.?Name ?? "no name";


Sprawdzimy, czy wartości są różne od null i jeśli któraś jest nullem, to wartość po lewej stronie zostanie ustawiona na null. Dodatkowo null - coalesce operator ustawi nam domyślną wartość.

Ponadto wewnątrz bloków catch można będzie wołać instrukcje poprzedzone keywordem await.

Exception filters:


catch(Exception ex) if(ex.InnerException == null){

}


Jeśli wyrażenie zwróci false, to wyjątek nie zostanie złapany.

Operator nameof:

zamiast:

throw new ArgumentNullException("name")

będzie można napisać


throw new ArgumentNullException(nameof(name))

Brak komentarzy:

Prześlij komentarz