Historia języka C#

Ten artykuł zawiera historię każdej głównej wersji języka C#. Zespół języka C# kontynuuje wprowadzanie innowacji i dodawanie nowych funkcji. Szczegółowy stan funkcji języka, w tym funkcje uważane za nadchodzące wydania, można znaleźć w repozytorium dotnet/roslyn w witrynie GitHub.

Ważne

Język C# opiera się na typach i metodach, które specyfikacja języka C# definiuje jako standardową bibliotekę dla niektórych funkcji. Platforma .NET dostarcza te typy i metody w wielu pakietach. Przykładem jest przetwarzanie wyjątków. Każda throw instrukcja lub wyrażenie jest sprawdzane, aby upewnić się, że zgłaszany obiekt pochodzi z Exceptionelementu . Podobnie każdy catch element jest sprawdzany, aby upewnić się, że przechwycony typ pochodzi z Exceptionklasy . Każda wersja może dodać nowe wymagania. Aby korzystać z najnowszych funkcji językowych w starszych środowiskach, może być konieczne zainstalowanie określonych bibliotek. Te zależności są udokumentowane na stronie dla każdej konkretnej wersji. Możesz dowiedzieć się więcej o relacjach między językiem i biblioteką na tle tej zależności.

C# w wersji 11

Wydany w listopadzie 2022 r.

W języku C# 11 dodano następujące funkcje:

Język C# 11 wprowadza ogólne funkcje matematyczne i kilka funkcji, które obsługują ten cel. Algorytmy liczbowe można pisać raz dla wszystkich typów liczbowych. Istnieje więcej funkcji ułatwiania pracy z typami struct , takimi jak wymagane elementy członkowskie i automatyczne struktury domyślne. Praca z ciągami jest łatwiejsza w przypadku literałów ciągów nieprzetworzonych, nowego wiersza w interpolacjach ciągów i literałów ciągów UTF-8. Funkcje, takie jak typy lokalne plików, umożliwiają prostsze generowanie źródeł. Na koniec wzorce list dodają większą obsługę dopasowywania wzorców.

C# w wersji 10

Wydany w listopadzie 2021 r.

Język C# 10 dodaje następujące funkcje i ulepszenia języka C#:

Więcej funkcji było dostępnych w trybie podglądu . Aby można było używać tych funkcji, należy ustawić wartość <LangVersion> na Preview wartość w projekcie:

Język C# 10 kontynuuje pracę nad motywami usuwania ceremonii, oddzielania danych od algorytmów i lepszej wydajności środowiska uruchomieniowego platformy .NET.

Wiele funkcji oznacza, że wpiszesz mniej kodu, aby wyrazić te same pojęcia. Struktury rekordów syntetyzują wiele z tych samych metod, które wykonują klasy rekordów . Obsługa struktur i typów anonimowych za pomocą wyrażeń. Globalne używanie dyrektyw i deklaracje przestrzeni nazw o zakresie plików oznaczają, że wyraźniej wyrażasz zależności i organizację przestrzeni nazw. Ulepszenia lambda ułatwiają deklarowanie wyrażeń lambda, w których są używane. Nowe wzorce właściwości i ulepszenia dekonstrukcji tworzą bardziej zwięzły kod.

Nowe procedury obsługi i AsyncMethodBuilder zachowanie ciągów interpolowanych mogą poprawić wydajność. Te funkcje językowe zostały zastosowane w środowisku uruchomieniowym platformy .NET w celu uzyskania ulepszeń wydajności na platformie .NET 6.

Język C# 10 oznacza również większą zmianę na roczną kadencję wydań platformy .NET. Ponieważ nie każda funkcja może zostać ukończona w rocznym przedziale czasu, możesz wypróbować kilka funkcji "w wersji zapoznawczej" w języku C# 10. Można używać zarówno atrybutów ogólnych, jak i statycznych elementów abstrakcyjnych w interfejsach , ale te funkcje w wersji zapoznawczej mogą ulec zmianie przed ich ostateczną wersją.

C# w wersji 9

Wydany w listopadzie 2020 r.

Język C# 9 został wydany za pomocą platformy .NET 5. Jest to domyślna wersja języka dla każdego zestawu przeznaczonego dla wersji .NET 5. Zawiera następujące nowe i ulepszone funkcje:

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

Instrukcje najwyższego poziomu oznaczają, że główny program jest prostszy do odczytania. Ceremonia jest mniejsza: przestrzeń nazw, Program klasa i static void Main() wszystkie niepotrzebne.

Wprowadzenie records zapewnia zwięzłą składnię typów referencyjnych, które są zgodne z semantykami wartości na potrzeby równości. Te typy służą do definiowania kontenerów danych, które zwykle definiują minimalne zachowanie. Inicjatory init-only zapewniają możliwość mutacji niedestrukcyjnej (with wyrażeń) w rekordach. Język C# 9 dodaje również kowariantne typy zwracane, aby rekordy pochodne mogły zastąpić metody wirtualne i zwrócić typ pochodzący z zwracanego typu metody bazowej.

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

Język C# 9 zawiera nowe ulepszenia dopasowywania wzorców:

  • Wzorce typów pasują do obiektu zgodnego z określonym typem
  • Wzorce nawiasów wymuszają lub podkreślają pierwszeństwo kombinacji wzorców
  • Wzorce sprzężone and wymagają dopasowania obu wzorców
  • Wzorce rozłączne or wymagają dopasowania obu wzorców
  • Negowane not wzorce wymagają, aby wzorzec nie był zgodny
  • Wzorce relacyjne wymagają, aby dane wejściowe stały się mniejsze niż, większe niż, mniejsze lub równe lub większe niż lub równe danej stałej.

Te wzorce wzbogacają składnię wzorców. Rozważ następujące przykłady:

public static bool IsLetter(this char c) =>
    c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

W przypadku opcjonalnych nawiasów, aby wyjaśnić, że and ma wyższy priorytet niż or:

public static bool IsLetterOrSeparator(this char c) =>
    c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.' or ',';

Jedną z najczęstszych zastosowań jest nowa składnia sprawdzania wartości null:

if (e is not null)
{
    // ...
}

Dowolny z tych wzorców może być używany w dowolnym kontekście, w którym dozwolone są wzorce: is wyrażenia wzorca, switch wyrażenia, wzorce zagnieżdżone i wzorzec switch etykiety instrukcji case .

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ą funkcję przypominającą delegata, unikając alokacji niezbędnych do utworzenia obiektu delegata.
  • Instrukcje localsinit można pominąć, aby zapisać instrukcje.

Wydajność i współdziałanie

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

  • Inicjatory modułów to metody wywoływane przez środowisko uruchomieniowe podczas ładowania zestawu.
  • Metody częściowe obsługują nowe modyfikatory dostępu i niepuste typy zwracane. W takich przypadkach należy podać implementację.

Dopasuj i zakończ funkcje

Język C# 9 dodaje wiele innych małych funkcji zwiększających produktywność deweloperów, zarówno pisanie, jak i odczytywanie kodu:

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

Wersja języka C# 9 kontynuuje pracę, aby język C# był nowoczesnym językiem programowania ogólnego przeznaczenia. Funkcje nadal obsługują nowoczesne obciążenia i typy aplikacji.

C# w wersji 8.0

Wydany we wrześniu 2019 r.

C# 8.0 jest pierwszą główną wersją języka C#, która jest przeznaczona dla platformy .NET Core. Niektóre funkcje korzystają z nowych funkcji CLR, a inne w przypadku typów bibliotek dodanych tylko na platformie .NET Core. Język C# 8.0 dodaje następujące funkcje i ulepszenia języka C#:

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

C# w wersji 7.3

Wydany w maju 2018 r.

Istnieją dwa główne motywy wersji C# 7.3. Jeden z motywów zawiera funkcje, które umożliwiają bezpieczne wykonywanie kodu jako niebezpiecznego kodu. 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.
  • Można ponownie przypisać ref zmienne lokalne.
  • Inicjatory można używać w stackalloc tablicach.
  • Instrukcje można używać fixed z dowolnym typem, który obsługuje wzorzec.
  • Możesz użyć bardziej ogólnych ograniczeń.

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

  • Można testować == i != za pomocą typów krotki.
  • Zmienne wyrażeń można używać w większej ilości lokalizacji.
  • Atrybuty można dołączyć do pola zapasowego właściwości implementowanych automatycznie.
  • Rozpoznawanie metod, gdy argumenty różnią się od in siebie, zostały ulepszone.
  • Rozwiązanie przeciążenia ma teraz mniej niejednoznacznych przypadków.

Nowe opcje kompilatora to:

  • -publicsign aby włączyć podpisywanie zestawów oprogramowania typu open source (OSS).
  • -pathmap w celu zapewnienia mapowania katalogów źródłowych.

C# w wersji 7.2

Wydany w listopadzie 2017 r.

Język C# 7.2 dodał kilka małych funkcji językowych:

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

C# w wersji 7.1

Wydany w sierpniu 2017 r.

Język C# rozpoczął wydawanie wydań punktów za pomocą języka C# 7.1. Ta wersja dodała element konfiguracji wyboru wersji języka, trzy nowe funkcje językowe i nowe zachowanie kompilatora.

Nowe funkcje językowe w tej wersji to:

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

Na koniec kompilator ma dwie opcje -refout i -refonly kontroluje generowanie zestawów odwołań

C# w wersji 7.0

Wydany w marcu 2017 r.

Język C# w wersji 7.0 został wydany w programie Visual Studio 2017. Ta wersja ma pewne ewolucyjne i fajne rzeczy w żyłach języka C# 6.0. Oto niektóre nowe funkcje:

Dostępne są inne funkcje:

Wszystkie te funkcje oferują nowe funkcje dla deweloperów i możliwość pisania czystszego kodu niż kiedykolwiek. Wyróżnienie kondensuje deklarację zmiennych do użycia ze out słowem kluczowym i zezwalając na wiele zwracanych wartości za pośrednictwem krotki. Platforma .NET Core jest teraz przeznaczona dla dowolnego systemu operacyjnego i ma oczy mocno w chmurze i na przenośność. Te nowe możliwości z pewnością zajmują myśli i czas projektantów języków, oprócz wymyślić nowe funkcje.

C# w wersji 6.0

Wydany w lipcu 2015 r.

Wersja 6.0 wydana z programem Visual Studio 2015 wydała 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 to:

  • Inicjatory indeksów
  • Oczekiwanie na bloki catch/finally
  • Wartości domyślne właściwości tylko do pobierania

Każda z tych funkcji jest interesująca we własnym zakresie. Ale jeśli spojrzysz na nie całkowicie, zobaczysz ciekawy wzorzec. W tej wersji język C# zaczął wyeliminować standardowy język, aby kod był bardziej czytelny i czytelny. Więc dla fanów czystego, prostego kodu ta wersja językowa była ogromną wygraną.

Zrobili jedną inną rzecz wraz z tą wersją, choć nie jest to tradycyjna funkcja języka sama w sobie. Wydali Roslyn kompilator jako usługę. Kompilator języka C# jest teraz napisany w języku C#, a kompilator można używać w ramach wysiłków programistycznych.

C# w wersji 5.0

Wydany w sierpniu 2012 r.

Język C# w wersji 5.0 wydany z programem Visual Studio 2012 był ukierunkowaną wersją języka. Prawie wszystkie wysiłki w tej wersji przeszły do innej przełomowej koncepcji języka: async modelu i await do programowania asynchronicznego. Oto główna lista funkcji:

Atrybut informacji o obiekcie wywołującym umożliwia łatwe pobieranie informacji o kontekście, w którym działasz, bez uciekania się do mnóstwa kodu odbicia kotłowego. Ma wiele zastosowań w zadaniach diagnostycznych i rejestrowania.

Ale async i await są prawdziwymi gwiazdami tej wersji. Kiedy te funkcje wyszły w 2012 roku, język C# ponownie zmienił grę, piecząc asynchronię w język jako uczestnik pierwszej klasy. Jeśli kiedykolwiek zajmowałeś się długotrwałymi operacjami i implementacją sieci Web wywołań zwrotnych, prawdopodobnie kochałeś tę funkcję języka.

C# w wersji 4.0

Wydany w kwietniu 2010 r.

Język C# w wersji 4.0, wydany z programem Visual Studio 2010, miałby trudny czas, aż do przełomowego stanu wersji 3.0. W tej wersji wprowadzono kilka interesujących nowych funkcji:

Osadzone typy międzyoperajności złagodziły problem z wdrażaniem tworzenia zestawów międzyoperacyjnych MODELU COM dla aplikacji. Ogólna kowariancja i kontrawariancja zapewniają większą moc do korzystania z typów ogólnych, ale są one nieco akademickie i prawdopodobnie najbardziej doceniane przez autorów struktur i bibliotek. Parametry nazwane i opcjonalne pozwalają wyeliminować wiele przeciążeń metod i zapewnić wygodę. Ale żadna z tych cech nie jest dokładnie zmiana paradygmatu.

Główną funkcją było wprowadzenie słowa kluczowego dynamic . Słowo dynamic kluczowe wprowadzone w języku C# w wersji 4.0 umożliwia zastępowanie kompilatora podczas wpisywania w czasie kompilacji. Używając dynamicznego słowa kluczowego, można tworzyć konstrukcje podobne do dynamicznie typiowanych języków, takich jak JavaScript. Możesz utworzyć element dynamic x = "a string" , a następnie dodać do niego sześć, pozostawiając go do środowiska uruchomieniowego, aby ustalić, co powinno się wydarzyć dalej.

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

C# w wersji 3.0

Wydany w listopadzie 2007 r.

Język C# w wersji 3.0 pojawił się pod koniec 2007 r. wraz z programem Visual Studio 2008, chociaż pełna łódź funkcji językowych będzie rzeczywiście zawierać program .NET Framework w wersji 3.5. Ta wersja oznaczała ważną zmianę wzrostu języka C#. Ustanowiono język C# jako naprawdę groźny język programowania. Przyjrzyjmy się niektórym głównym funkcjom w tej wersji:

Z perspektywy czasu wiele z tych cech wydaje się zarówno nieuniknione, jak i nierozłączelne. Wszystkie pasują do siebie strategicznie. Uważa się, że funkcja zabójcy wersji języka C# była wyrażeniem zapytania, znanym również jako Zapytanie zintegrowane z językiem (LINQ).

Bardziej zniuansowany widok analizuje drzewa wyrażeń, wyrażenia lambda i typy anonimowe jako podstawę, na której jest skonstruowany LINQ. Jednak w obu przypadkach język C# 3.0 przedstawił rewolucyjne pojęcie. Język C# 3.0 zaczął ułożyć podstawy przekształcania języka C# w hybrydowy język zorientowany na obiekt /funkcjonalny.

W szczególności można teraz pisać zapytania deklaratywne w stylu SQL, aby wykonywać między innymi operacje na kolekcjach. Zamiast pisać pętlę for , aby obliczyć średnią z listy liczb całkowitych, teraz można to zrobić tak samo jak list.Average(). Kombinacja wyrażeń zapytań i metod rozszerzeń sprawiła, że lista liczb całkowitych jest o wiele mądrzejsza.

C# w wersji 2.0

Wydany w listopadzie 2005 r.

Przyjrzyjmy się niektórym głównym funkcjom języka C# 2.0 wydanym w 2005 r. wraz z programem Visual Studio 2005:

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

  • Uzyskiwanie/ustawianie oddzielnych ułatwień dostępu
  • Konwersje grup metod (delegatów)
  • Klasy statyczne
  • Wnioskowanie delegowania

Chociaż język C# mógł zostać uruchomiony jako ogólny język obiektowo-zorientowany (OO), język C# w wersji 2.0 zmienił się w pośpiechu. W przypadku typów ogólnych, typy i metody mogą działać na dowolnym typie, zachowując bezpieczeństwo typów. Na przykład posiadanie elementu List<T> umożliwia List<string> lub List<int> i wykonywanie bezpiecznych operacji na tych ciągach lub liczbach całkowitych podczas wykonywania iteracji po nich. Używanie typów ogólnych jest lepsze niż tworzenie ListInt typu pochodzącego z ArrayList lub rzutowania z Object każdego działania.

Wprowadzono iteratory w języku C# w wersji 2.0. Aby umieścić ją zwięźle, iteratory pozwalają zbadać wszystkie elementy w List (lub innych typach wyliczanych) za pomocą foreach pętli. Iteratory jako pierwszoklasowa część języka znacznie zwiększyły czytelność języka i zdolność ludzi do rozumowania o kodzie.

A jednak język C# nadal gra trochę nadrobić zaległości w języku Java. Środowisko Java wydało już wersje, które obejmowały typy ogólne i iteratory. Ale to wkrótce zmieni się, gdy języki nadal ewoluowały.

C# w wersji 1.2

Wydany w kwietniu 2003 r.

Język C# w wersji 1.2 dostarczany z programem Visual Studio .NET 2003. Zawierał on kilka małych ulepszeń języka. Najbardziej godne uwagi jest to, że począwszy od tej wersji, kod wygenerowany w foreach pętli wywoływanej Dispose podczas IEnumeratorIEnumerator implementacji IDisposable.

C# w wersji 1.0

Wydanie: styczeń 2002 r.

Po powrocie i spojrzeniu język C# w wersji 1.0 wydany z programem Visual Studio .NET 2002 wyglądał podobnie do języka Java. W ramach deklarowanych celów projektowych dla ECMA, starał się być "prostym, nowoczesnym, uniwersalnym językiem obiektowym". W tym czasie, patrząc jak w języku Java, oznaczało to osiągnięcie tych wczesnych celów projektowych.

Ale jeśli spojrzeć wstecz na C# 1.0 teraz, znajdziesz się trochę zawroty głowy. Brakowało wbudowanych funkcji asynchronicznych i niektórych funkcji slick wokół typów ogólnych, które należy wziąć za pewnik. W rzeczywistości brakowało mu w ogóle typów ogólnych. I LINQ? Jeszcze nie jest dostępny. Te dodatki zajęłyby kilka lat, aby wyjść.

Język C# w wersji 1.0 wyglądał na pozbawiony funkcji w porównaniu z dzisiejszymi wersjami. Możesz napisać pełny kod. Ale jednak musisz zacząć gdzieś. Język C# w wersji 1.0 był realną alternatywą dla języka Java na platformie Windows.

Główne funkcje języka C# 1.0:

Artykułpierwotnie opublikowany na blogu NDepend, dzięki uprzejmości Erik Dietrich i Patrick Smacchia.