C# 6.0 RoslynUzyskajmy najpierw pewną perspektywę.

Pierwsza edycja języka C# 1.0 pojawiła się 2002 roku. Obecnie więc C# ma 12 lat. (2014)

W roku 2005 pojawiła się wersja 2.0 a wraz z nią typy generyczne (List<T>). Teraz trudno sobie wyobrazić programowanie bez nich.

W roku 2007 do C# 3.0  został dodany LINQ czyli wyrażenia lambda, zapytania, które filtrują po kolekcjach obiektów oraz po kolekcjach ORM, które zostały dopiero pobrane. Nie jestem w stanie wyobrazić sobie programowania bez LINQ.

W roku 2010 do C# 4.0 został dodane słowo kluczowe “dynamic” . Programowanie dynamicznie nie jest czymś, co możesz robić każdego dnia. Ja na przykład nie używałem tego mechanizmu wcale. Jednakże ten dynamiczny mechanizm pozwala w statycznym typowanym języku, jakim jest C# na ciekawe użycia innych bibliotek, napisanych choćby w Pythonie. Coś jest statycznie deklarowane, że będzie dynamicznie. Tak to działa.

W 2012 roku do C# 5.0 zostały dodane słowa kluczowe “async” i “await”. Pozwalają one na łatwiejsze pisanie i wywoływanie asynchronicznych funkcji, choćby wezwań do usługi WCF.

Wiem, że ma się pojawić się wersja 6.0. Co nowego ta wersja przyniesie?. Językma już 12 lat i widać, że jest to dojrzały język programowania.

Najważniejsze możliwości szybkim okiem

W następnych dwóch wpisach omówię szerzej nowe funkcje języka C#. Nic jednak nie stoi na przeszkodzie aby teraz szybko omówić te nowe funkcje. Detale jednak przyjdą później.

public class Person
{
    public int Id { get; } = -1;
}

Ta funkcja pozwala na ustawienie domyślnej wartości dla danej automatycznej właściwości. Dzięki temu jest możliwe stworzenie właściwości tylko odczytu z domyślną wartością.

2014-11-11: Ta funkcjonalność została przesunięta do następnej wersji C#. Więcej

public class Ruler(string unitsName,decimal value)
{
    public string UnitsName { get; } = unitsName;
    public decimal Value { get; } = value;
}

public class Circle(int radius)
{
    public int Radius { get; } = radius;
}

W klasach i strukturach jest możliwe dodawanie parametrów do nazwy klasy w następujący sposób. Definiuje główny konstruktor klasy. Można później użyć tych parametrów do właściwości, korzystając z poprzednio omówionej funkcji. W skrócie ta funkcjonalność pozwala na  krótszy zapisz klasy. Poniżej znajduje się taka sama deklaracja klasy przy użyciu starej składni.

public class Ruler
{
    public Ruler(string unitName,decimal value)
    {
        UnitsName = unitName;
        Value = value;
    }

    public string UnitsName { get; private set; }
    public decimal Value { get; private set; }
}

public class Circle
{
    public Circle(int radius)
    {
        Radius = radius;
    }

    public int Radius { get; private set; } 
}
using System.Console;

namespace CSharp6Example
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("Hello");
        }
    }
} 

Wyrażenia using w C# 6 pozwolą nam na określenie statycznych nazw. Co to znaczy? Co to daje?

Określając w usingu klasę statyczną, możesz później wywoływać metody danej klasy bez zbędnego pisanie jej nazwy.

Jak widać powyżej, jestem w stanie wywołać metodę WriteLine bez pisania typu klasy “Console”.

Nowa możliwość - inicjacja słowników

Dictionary<string, Person> _persons =
    new Dictionary<string, Person>()
    { 
        ["programista"] = new Person(),
        ["grafik"] = new Person()
    };

Istnieje wiele nowych składni inicjujących różne kolekcje w C# 6.  Słowniki są jednym z nich. W nawiasach kwadratowych podajemy klucz

Nowe składnie dla wyrażeń liczbowych.

2014-11-11: Ta funkcjonalność została wycofana

public class NumbersSixCSharp
{
    public long MyCash { get; } = 1_500_000_000;
    public byte SecretCode { get; } = 0b1100;
}

W C# 6 możemy dodać podkreślenia do wyrażeń liczbowych sprawiając, że duże cyfry są łatwiejsze do odczytu. Możemy także określić bajt używając systemu bitowego zero -jedynkowego.

Istnieje oczywiście dużo więcej możliwości.

Kompilator Roslyn

Kod kompilatora Rosyl jest open source. Możesz go pobrać, zobaczyć kod, przeczytać i poeksperymentować.

Jest to ten sam kompilator, który niedługo będzie w Visual Studio 2014.

Co jest w nim takiego specjalnego? Kompilator ten jest w roli platformy – kompilator, który pełni tylko rolę usługi. Co to znaczy?

Oznacza to, że kompilator nie tylko tłumaczy pliki źródłowe na biblioteki dll-ki. Roslyn, oferuje także biblioteki, do których możesz się odnieść. Posiada API, które może być użyte w solucji i w plikach źródłowych.

Używając Visual Studio. możesz napisać rozszerzenia do tego kompilatora. Rozszerzenia te możesz naturalnie podłączyć do Visual Studio, by potem przykładowo dawać swoje własne ostrzenia i błędy  w trakcie kompilowania kodu.

Kompilator Roslyn

Jak więc zobaczyć ten kod źródłowy. Wystarczy na stronie https://roslyn.codeplex.com/ kliknąć na zakładkę “Source Code” i zacząć przeglądać.

Jeśli jednak chcesz ściągnąć kod i z nim pracować, to warto przeczytać i zapoznać się z likami, które znajdują się trochę poniżej.

Kod źródłowy Kompilator Roslyn

Proces przygotowania nie jest łatwy. Dlatego warto przeczytać artykuł “Building, Testing and Debugging”.

Obecnie wymaga to najnowszej wersji CTP Visual Studio. Obraz iso CTP Visual Studio 2014 ma 4 GB więc zabawa jest już ciekawa.

Użycie Kompilator Roslyn

Zanim jednak wszystko będzie działać magicznie, trzeba jeszcze pamiętać, że biblioteki Roslyn są podpisane specjalnym kluczem Microsoftu. Klucz ten nie jest dostępny dla zwykłych ludzi, więc trzeba wyłączyć weryfikację bibliotek. Tak aby nasze biblioteki Roslyn bez klucza mogły działać.

Nie zapomnij, że projekt można pobrać używając Git-a.

Projekt ScriptCS

Obecnie istnieje jeden projekt, który używa kompilatora Roslyn. Jest to projekt ScriptCS. Jak sama nazwa mówi pozwala on na użycie C# w skryptowej formie.

http://scriptcs.net/

Czyli język c# zachowuje się jak język skryptowy (JavaScript,Python).

Oznacza to, że jesteś w stanie napisać kod w notatniku i go odpalić bez użycia Visual Studio.

Po co to?

W ten sposób możesz edytować pliki źródłowe c# i zobaczyć w powershellu lub w cmd, czy dany komponent działa.

Jak to działa?

Z magiczną kurtyną ScriptCS używam kompilatora Roslyn do kompilowania i egzekucji kodu.

Jak więc zobaczyć działanie tego narzędzia w akcji? Najłatwiej jest je zainstalować używając Chocolatey. Najpierw w wierszu poleceń musisz zainstalować Chocolatey. Wystarczy, że wpiszesz polecenie.

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

Mając już Chocolatey instalacja ScriptCS jest prosta.

cinst scriptcs

Chocolatey instalacja ScriptCS

Przed wpisywaniem komend, warto uruchomić wiersz poleceń jako administrator. Ja przez to miałem dziwne problemy.

Teraz możesz pisać w C# w konsoli. Używając polecenia “scriptcs”.

ScriptCS

Na przykład możesz napisać klasę i ją wywołać.

Prawdziwa moc jednak bierze się z możliwości uruchamiania testów i korzystania z innych bibliotek w celu ich testowania.

Jak rozpocząć przygodę

Trzeba pobrać Visual Studio CTP 14.

Visual Studio 14 CTP

http://www.visualstudio.com/en-us/downloads/visual-studio-14-ctp-vs

Warto zaznaczyć, że VS CTP 14 jest nazwą roboczą i być może w przyszłości będzie się nazywać Visual Studio 2015.

Obecny trend jest taki: VS 2003 –>VS 2005 –> VS 2008 –> VS 2010 –> VS 2012 –> VS 2013 –> ?.

Nigdy nic nie wiadomo.

Oprócz VS CTP warto zainstalować

NET Compiler Platform Syntax Visualizer

Zanim rozpoczniesz swoją przygodę, musisz także pamiętać o jednej rzeczy.

Trochę byłem zdziwiony, gdy Visual Studio nie chciało współpracować z nowymi dodatkami języka C# 6. Na szczęście znalazłem przyczynę i stworzyłem osobny wpis.

Zacznijmy  więc przygodę z c# 6.0