Historia języka C#

Ten artykuł zawiera historię poszczególnych głównych wersji języka C#. Zespół języka C# wciąż wprowadza innowacje i dodaje nowe funkcje. Szczegółowy stan funkcji języka, w tym funkcje rozważane w nadchodzących wersjach, można znaleźć w repozytorium dotnet/roslyn w GitHub.

Ważne

Język C# opiera się na typach i metodach w tym, co specyfikacja C# definiuje jako standardową bibliotekę dla niektórych funkcji. Platforma .NET dostarcza te typy i metody w wielu pakietach. Jednym z przykładów jest przetwarzanie wyjątków. Każda instrukcja lub wyrażenie jest sprawdzane, aby upewnić się, throw że zgłaszany obiekt pochodzi z klasy Exception . Podobnie każdy jest sprawdzany, aby upewnić się, catch że przechwycony typ pochodzi od klasy Exception . Każda wersja może dodać nowe wymagania. Aby korzystać z najnowszych funkcji języka w starszych środowiskach, może być konieczne zainstalowanie określonych bibliotek. Te zależności są udokumentowane na stronie dla każdej określonej wersji. Możesz dowiedzieć się więcej na temat relacji między językiem i biblioteką, aby uzyskać podstawowe informacje na temat tej zależności.

C# w wersji 1.0

Gdy wrócisz i spojrzysz, język C# w wersji 1.0 wydanej z programem Visual Studio .NET 2002 wyglądał bardzo podobnie do języka Java. W ramach określonych celów projektowych dla ecmacelem było "proste, nowoczesne, zorientowane obiektowo język ogólnego przeznaczenia". W tym czasie, wyglądając jak środowisko Java, oznaczało to, że osiągnięto te wczesne cele projektowe.

Jeśli jednak teraz spojrzysz wstecz na język C# 1.0, możesz się nieco smutować. Nie ma wbudowanych możliwości asynchronicznych i niektórych funkcji slick wokół typów ogólnych, które należy przyznać. W rzeczywistości w ogóle nie zawierała typów ogólnych. I LINQ? Jeszcze niedostępne. Te dodatki mogą potrwać kilka lat.

Język C# w wersji 1.0 nie zawierał funkcji w porównaniu z obecnie. Możesz napisać pełny kod. Ale jeszcze trzeba zacząć gdzieś. Język C# w wersji 1.0 był realną alternatywą dla języka Java na Windows platformie.

Najważniejsze funkcje języka C# 1.0:

C# w wersji 1.2

Język C# w wersji 1.2 dostarczany z Visual Studio .NET 2003. Zawiera on kilka małych ulepszeń języka. Najbardziej ważne jest to, że począwszy od tej wersji, kod wygenerowany w pętli wywoływanej w pliku , foreach Dispose gdy IEnumerator IEnumerator zaimplementowano element IDisposable .

C# w wersji 2.0

Teraz wszystko zaczyna być interesujące. Przyjrzyjmy się niektórym głównym cechom języka C# 2.0 wydanym w 2005 r. wraz z Visual Studio 2005 r.:

Inne funkcje języka C# 2.0 dodały możliwości do istniejących funkcji:

  • Oddzielne ułatwienia dostępu getter/setter
  • Konwersje grup metod (delegaty)
  • Klasy statyczne
  • Wnioskowanie delegata

Chociaż język C# mógł zaczynać się jako ogólny język Object-Oriented (OO), w wersji 2.0 język C# zmienił to w niesłabnący sposób. Gdy już mieli pod nimi stopę, poszli po poważne problemy dewelopera. Poszli za nimi w znaczący sposób.

W przypadku typów ogólnych typy i metody mogą działać na dowolnym typie przy zachowaniu bezpieczeństwa typów. Na przykład posiadanie obiektu umożliwia wykonywanie bezpiecznych dla typów operacji na ciągach lub liczbach całkowitych podczas List<T> List<string> List<int> iterowania po nich. Używanie typów ogólnych jest lepsze niż tworzenie typu, który pochodzi od lub ListInt ArrayList rzutowania Object z dla każdej operacji.

W języku C# w wersji 2.0 wprowadzono iteratory. Mówiąc zwięźle, iteratory umożliwiają badanie wszystkich elementów w (lub innych typach List enumerowalnych) za pomocą foreach pętli. Iteratory jako pierwszoklasowa część języka znacznie poprawiły czytelność tego języka i możliwości ludzi w rozumiałach dotyczących kodu.

A mimo to język C# nadal trochę nadrobiał nadrobić zaległości w języku Java. Język Java udostępnił już wersje, które zawierały typy ogólne i iteratory. Jednak wkrótce się to zmieni, ponieważ języki nadal się rozwijały.

C# w wersji 3.0

Język C# w wersji 3.0 pojawił się pod koniec 2007 r. wraz z wersją Visual Studio 2008, chociaż pełna wersja funkcji językowych w rzeczywistości byłaby dostępna w wersji 3.5 .NET Framework. Ta wersja oznaczała dużą zmianę w rozwoju języka C#. Ustalono, że język C# jest naprawdę bardzo formowalnym językiem programowania. Przyjrzyjmy się niektórym głównym funkcjiom w tej wersji:

W retrospektywie wiele z tych funkcji wydaje się być zarówno nieuniknionych, jak i nierozdzielnych. Wszystkie one pasują do siebie strategicznie. Uważa się, że funkcja w wersji języka C# jest wyrażeniem zapytania, znanym również jako Language-Integrated Query (LINQ).

Bardziej złożonych widok analizuje drzewa wyrażeń, wyrażenia lambda i anonimowe typy jako podstawę, na której zbudowano LINQ. Jednak w obu przypadkach język C# 3.0 przedstawiał niesłychaną koncepcję. W języku C# 3.0 rozpoczęto prace nad przekształceniem języka C# w hybrydowy język Object-Oriented/funkcjonalny.

W szczególności można teraz pisać zapytania deklaratywne SQL stylu, aby między innymi wykonywać operacje na kolekcjach. Zamiast pisać pętlę do obliczania średniej z listy liczb całkowitych, można teraz for zrobić to tak samo jak list.Average() . Kombinacja wyrażeń zapytań i metod rozszerzeń wyglądała tak, jakby lista liczb całkowitych była znacznie inteligentna.

Ludzie mieli czas, aby naprawdę zrozumieć i zintegrować koncepcję, ale stopniowo to robili. A teraz, lata później, kod jest znacznie bardziej zwięzły, prosty i funkcjonalny.

C# w wersji 4.0

Język C# w wersji 4.0 wydanej z Visual Studio 2010 r. miał trudny czas, aż do przełomowego stanu wersji 3.0. W wersji 3.0 język C# został zdecydowanie przeniesiony z cienia języka Java i na wyeksminowanie. Język szybko stał się elegancki.

W następnej wersji wprowadzono kilka interesujących nowych funkcji:

Osadzone typy międzyopłaciowe ułatwiły wdrażanie problemów z tworzeniem zestawów międzyoptykowych COM dla aplikacji. Kowariancja ogólna i kontrawariancja zapewniają większą moc do używania typów ogólnych, ale są nieco akademickie i prawdopodobnie najbardziej cenione przez autorów struktury i bibliotek. Parametry nazwane i opcjonalne pozwalają wyeliminować wiele przeciążeń metod i zapewnić wygodę. Jednak żadna z tych funkcji nie zmienia dokładnie paradygmatu.

Główną funkcją było wprowadzenie słowa dynamic kluczowego . Słowo dynamic kluczowe wprowadzone w języku C# w wersji 4.0 umożliwia zastąpienie kompilatora podczas wpisywania w czasie kompilacji. Za pomocą słowa kluczowego dynamic można tworzyć konstrukcje podobne do języków typicznie wpisanych dynamicznie, takich jak JavaScript. Możesz utworzyć , a następnie dodać do niego sześć, pozostawiając środowisko uruchomieniowe, aby dynamic x = "a string" określić, co powinno się wydarzyć dalej.

Powiązanie dynamiczne daje możliwość błędów, ale także dużą moc w języku.

C# w wersji 5.0

Wersja 5.0 języka C#, wydana Visual Studio 2012 r., była ukierunkowaną wersją języka. Niemal cały nakład pracy dla tej wersji przeszedł do innej przełomowej koncepcji języka: async modelu await i dla programowania asynchronicznego. Oto lista najważniejszych funkcji:

Zobacz też

Atrybut informacji o wywołującym umożliwia łatwe pobieranie informacji o kontekście, w którym działasz, bez konieczności korzystania z tony ujedna kod odbicia. Ma wiele zastosowań w zadaniach diagnostyki i rejestrowania.

Ale async i await są prawdziwymi gwiazdami tej wersji. Gdy te funkcje pojawiły się w 2012 r., język C# ponownie zmienił grę, upieczony asynchronicznie na język jako uczestnik pierwszej klasy. Jeśli kiedykolwiek zajmowasz się długotrwałych operacjami i implementacją sieci Web wywołań zwrotnych, prawdopodobnie chylisz się nad tą funkcją języka.

C# w wersji 6.0

W wersjach 3.0 i 5.0 język C# dodał główne nowe funkcje w języku obiektowym. W wersji 6.0 wydanej wraz z programem Visual Studio 2015 nie będzie ona już dominującą funkcją, a zamiast tego wyda wiele mniejszych funkcji, które sprawiły, że programowanie w języku C# było bardziej wydajne. Oto niektóre z nich:

Inne nowe funkcje obejmują:

  • Inicjatory indeksów
  • Await w blokach catch/finally
  • Wartości domyślne właściwości tylko do getter

Każda z tych funkcji jest sama w sobie interesująca. Jeśli jednak przyjrzysz się im w całości, zobaczysz interesujący wzorzec. W tej wersji język C# wyeliminował ze wszystkich języków, aby kod był bardziej czytelny i bardziej czytelny. Dlatego dla fanów czystego, prostego kodu ta wersja językowa była ogromną przewagą.

Zrobili jeszcze jedną rzecz wraz z tą wersją, chociaż nie jest to funkcja języka tradycyjnego. Wydali kompilator Roslyn jako usługę. Kompilator języka C# jest teraz napisany w języku C# i można go używać w ramach działań programistycznych.

C# w wersji 7.0

Język C# w wersji 7.0 został wydany Visual Studio 2017 r. Ta wersja ma pewne ewolucyjne i ciekawe rzeczy w 6.0 języka C#, ale bez kompilatora jako usługi. Oto niektóre z nowych funkcji:

Inne funkcje:

Wszystkie te funkcje oferują deweloperom nowe, ciekawe możliwości i możliwość pisania jeszcze bardziej czystszego kodu niż kiedykolwiek wcześniej. Wyróżnianie to skondensowanie deklaracji zmiennych do użycia ze słowem kluczowym i umożliwienie wielu wartości zwracanych out za pośrednictwem krotki.

Język C# jest jednak coraz szerszy. Program .NET Core jest teraz przeznaczony dla dowolnego systemu operacyjnego i ma swoje spojrzenie na chmurę i przenośność. Te nowe możliwości z pewnością zajmują czas i przemyślenia projektantów językowych, a także nadchodzą z nowymi funkcjami.

C# w wersji 7.1

Język C# zaczął wydawać wydania punktów w języku C# 7.1. W tej wersji dodano element konfiguracji wyboru wersji języka, trzy nowe funkcje języka i nowe zachowanie kompilatora.

Nowe funkcje językowe w tej wersji to:

  • async``MainMetoda
    • Punkt wejścia aplikacji może mieć async modyfikator .
  • default wyrażenia literałów
    • Domyślnych wyrażeń literałów można używać w wyrażeniach wartości domyślnych, gdy można wywnioskować typ docelowy.
  • Wywnioskowane nazwy elementów krotki
    • Nazwy elementów krotki można w wielu przypadkach wywnioskować na podstawie inicjalizacji krotki.
  • Dopasowywanie wzorca dla parametrów typu ogólnego
    • Wyrażenia dopasowania wzorca można używać w zmiennych, których typ jest parametrem typu ogólnego.

Na koniec kompilator ma dwie -refout opcje, które -refonly kontrolują generowanie zestawu referencyjnego

C# w wersji 7.2

W języku C# 7.2 dodano kilka małych funkcji językowych:

  • Inicjatory w stackalloc tablicach.
  • Używaj fixed instrukcji z dowolnym typem, który obsługuje wzorzec.
  • Uzyskiwanie dostępu do stałych pól bez przypinania.
  • Ponowne przypisanie ref zmiennych lokalnych.
  • Zadeklaruj typy, aby wskazać, że struktura jest niezmienna i powinna być przekazywana readonly struct jako parametr do jej metod in członkowskich.
  • Dodaj modyfikator do parametrów , aby określić, że argument jest przekazywany przez odwołanie, in ale nie modyfikowany przez wywołaną metodę.
  • Użyj modyfikatora dla metody returns , aby wskazać, że metoda zwraca swoją wartość przez odwołanie, ale nie zezwala na zapis ref readonly do tego obiektu.
  • Zadeklaruj typy, aby wskazać, że typ struktury uzyskuje bezpośredni dostęp do pamięci zarządzanej ref struct i musi zawsze być przydzielony stos.
  • Użyj dodatkowych ogólnych ograniczeń.
  • Argumenty nazwane inne niż końcowe
    • Po nazwanych argumentach mogą nasuwniać się argumenty pozycyjne.
  • Wiodące podkreślenia w literałach liczbowych
    • Literały numeryczne mogą teraz mieć wiodące podkreślenia przed dowolnymi cyframi drukowanymi.
  • private protected modyfikator dostępu
    • private protectedModyfikator dostępu umożliwia dostęp do klas pochodnych w tym samym zestawie.
  • Wyrażenia ref warunkowe
    • Wynik wyrażenia warunkowego ( ?: ) może być teraz odwołaniem.

C# w wersji 7.3

Istnieją dwa główne motywy wydania języka C# 7.3. Jeden motyw zawiera funkcje, które umożliwiają bezpieczne kodowi tak samo sprawnego działania jak niebezpieczny kod. Drugi motyw zawiera przyrostowe ulepszenia istniejących funkcji. W tej wersji dodano również nowe opcje kompilatora.

Następujące nowe funkcje obsługują motyw lepszej wydajności bezpiecznego kodu:

  • Dostęp do stałych pól można uzyskać bez przypinania.
  • Zmienne lokalne można ponownie ref przypisać.
  • W tablicach można używać stackalloc inicjatorów.
  • Instrukcji można używać fixed z dowolnym typem, który obsługuje wzorzec.
  • Można użyć bardziej ogólnych ograniczeń.

Wprowadzono następujące ulepszenia istniejących funkcji:

  • Możesz testować == i za pomocą typów != krotek.
  • Zmiennych wyrażeń można używać w większej liczby lokalizacjach.
  • Atrybuty można dołączać do pola zapasowego automatycznie implementowane właściwości.
  • Ulepszono metodę rozpoznawania, gdy in argumenty różnią się od siebie.
  • Rozpoznanie przeciążenia ma teraz mniej niejednoznaczności.

Nowe opcje kompilatora to:

  • -publicsign w celu włączenia podpisywania zestawów przez oprogramowanie open source (OSS).
  • -pathmap w celu zapewnienia mapowania katalogów źródłowych.

C# w wersji 8.0

C# 8.0 to pierwsza główna wersja języka C#, która jest szczególnie przeznaczony dla .NET Core. Niektóre funkcje polegają na nowych możliwościach clr, inne na typach bibliotek dodanych tylko na .NET Core. W języku C# 8.0 dodano następujące funkcje i ulepszenia języka C#:

Domyślne elementy członkowskie interfejsu wymagają ulepszeń w clr. Te funkcje zostały dodane w clr dla programu .NET Core 3.0. Zakresy i indeksy oraz asynchroniczne strumienie wymagają nowych typów w bibliotekach .NET Core 3.0. Typy referencyjne dopuszczające wartość null, zaimplementowane w kompilatorze, są znacznie bardziej przydatne, gdy biblioteki mają adnotacje w celu zapewnienia semantycznych informacji dotyczących stanu wartości null argumentów i wartości zwracanych. Te adnotacje są dodawane w bibliotekach .NET Core.

C# w wersji 9.0

Język C# 9.0 został wydany wraz z .NET 5. Jest to domyślna wersja języka dla każdego zestawu, który jest przeznaczony dla wersji .NET 5. Zawiera on następujące nowe i ulepszone funkcje:

W języku C# 9.0 dodano następujące funkcje i ulepszenia języka C#:

Język C# 9.0 kontynuuje trzy motywy z poprzednich wersji: usuwanie procederów, oddzielanie danych od algorytmów i dostarczanie większej liczby wzorców w większej liczby miejsc.

Instrukcje najwyższego poziomu oznaczają, że główny program jest prostszy do odczytania. Nie ma potrzeby mniejszej konieczności owania: przestrzeni nazw, Program klasy i static void Main() wszystkich niepotrzebnych.

Wprowadzenie tej funkcji records zapewnia zwięzłą składnię typów referencyjnych, które są zgodne z semantyką wartości dla równości. Te typy będą używane do definiowania kontenerów danych, które zwykle definiują minimalne zachowanie. Zestawy ustawiające tylko init zapewniają możliwość nieniszczących i destruktywnych wyrażeń with (wyrażeń) w rekordach. Język C# 9.0 dodaje również kowariantne typy zwracane, dzięki czemu rekordy pochodne mogą przesłonić metody wirtualne i zwrócić typ pochodzący z typu zwracanego metody bazowej.

Możliwości dopasowywania wzorców zostały rozszerzone na kilka sposobów. Typy liczbowe obsługują teraz wzorce zakresu. Wzorce można łączyć przy użyciu and or wzorców , i not . Nawiasy można dodać, aby wyjaśnić bardziej złożone wzorce.

Inny zestaw funkcji obsługuje obliczenia o wysokiej wydajności w języku C#:

  • Typy nint i nuint modeluje typy liczb całkowitych o rozmiarze natywnym na docelowym procesorze CPU.
  • Wskaźniki funkcji zapewniają funkcje podobne do delegatów, jednocześnie unikając alokacji niezbędnych do utworzenia obiektu delegata.
  • Instrukcję localsinit można pominąć, aby zapisać instrukcje.

Inny zestaw ulepszeń obsługuje scenariusze, w których generatory kodu dodają funkcje:

  • Inicjatory modułów to metody, które środowisko uruchomieniowe wywołuje podczas ładowania zestawu.
  • Metody częściowe obsługują nowe modyfikatory z dostępem i zwracane typy niepuste. W takich przypadkach należy zapewnić implementację.

Język C# 9.0 dodaje wiele innych małych funkcji, które poprawiają produktywność deweloperów, zarówno podczas pisania, jak i odczytywania kodu:

  • Wyrażenia typu new docelowego
  • static funkcje anonimowe
  • Wyrażenia warunkowe typu docelowego
  • Obsługa GetEnumerator() rozszerzeń dla foreach pętli
  • Wyrażenia lambda mogą deklarować parametry odrzucania
  • Atrybuty można stosować do funkcji lokalnych

Wersja C# 9.0 kontynuuje pracę nad utrzymaniem nowoczesnego języka programowania ogólnego przeznaczenia w języku C#. Funkcje nadal obsługują nowoczesne obciążenia i typy aplikacji.

Artykuł pierwotnie opublikowany w blogu NDepend( dzięki uprzejmości Erika Ericricha i Patricka Sma poszukamy).