Historia języka C#
Silv
Ten artykuł opisuje historię języka C#.
***
TODO
- Pozbyć się znaków zapytania (znak zapytania oznacza, że nie wiadomo albo czy wyraz przed tym znakiem lub cały punkt z tym znakiem powinien być umieszczony pod daną datą, albo czy ma sens pod jego punktem nadrzędnym, albo czy w ogóle jest prawdziwy)
- Uspójnić styl (wszystkie punkty powinny być równoważnikami zdania, zaczynającymi się albo rzeczownikami "zwykłymi", albo rzeczownikami odczasownikowymi)
- Przełumaczyć tekst z angielskiego na polski (na tyle, na ile się da, by był zrozumiały)
- Zamienić pojęcia na linki do nich (najlepiej do Wikipedii, ewentualnie do oficjalnej dokumentacji, ewentualnie do innych uznanych stron)
Historia
1988
- Pierwsze wystąpienie nazwy "C#" [1]
1999-01
- Utworzenie przez Andersa Hejlsberga zespołu mającego stworzyć nowy język programowania o nazwie "Cool" [1]
2000-07 lub wcześniej
- Zmiana nazwy języka Cool na "C#" [1]
2001-01
- Rozpoczęcie projektu DotGNU [5]
2001-12
- Przyjęcie pierwszego wydania standardu ECMA-334 [1] [27]
2002-01
- Wydanie wersji 1.0 języka C# [1]
2002-12
- Przyjęcie drugiego wydania standardu ECMA-334 [1] [27]
2003
- Wydanie wersji 1.1 języka C# [1]
- Wydanie wersji 1.2 języka C# [1]
- Wprowadzenie wywoływania
Disposeprzez kod wygenerowany w pętliforeachna instancji klasy? implementującej interfejsIEnumerator, jeśli ta klasa? implementuje interfejsIDisposable[8]
- Wprowadzenie wywoływania
- Przyjęcie standardu ISO/IEC 23270 [1]
2003-04
- Opublikowanie standardu ISO/IEC 23270:2003 [28]
2004
- Rozpoczęcie projektu Mono [1]
2004-01-29
- Zakończenie promowania języka C# maskotką "Andy" [1]
2005
- Wydanie wersji 2.0 języka C# [1] [8]
- Wprowadzenie funkcji "first-class" [1]
- Wprowadzenie domknięć (w formie delegatów anonimowych)? [1]
- Wprowadzenie typów generycznych [8]
- Wprowadzenie typów częściowych (ang. partial types) [8]
- Wprowadzenie słowa kluczowego
partial[33] - Wprowadzenie podziału na "accumulative qualities" i "non-accumulative qualities"? [33]
- Wprowadzenie słowa kluczowego
- Wprowadzenie metod anonimowych [8]
- Wprowadzenie "nullable value types" [8]
- Wprowadzenie iteratorów [8] (zobacz też [33])
- Wprowadzenie instrukcji
yield return? [33] - Wprowadzenie instrukcji
yield break? [33]
- Wprowadzenie instrukcji
- Wprowadzenie kowariancji i kontrawariancji [8]
2005-06
- Przyjęcie trzeciego wydania standardu ECMA-334 [1] [27]
2006 lub wcześniej
- Wycofanie standardu ISO/IEC 23270:2003 [1]
- Przyjęcie standardu ISO/IEC 23270:2006 [1]
2006-09
- Opublikowanie standardu ISO/IEC 23270:2006 [1] [28]
2006-06
- Przyjęcie czwartego wydania standardu ECMA-334 (wersja 2 języka C#?) [1] [27]
2006-09
- Przyjęcie standardu ISO/IEC dla wersji 2.0 języka C# [1]
2007
- Wydanie wersji 3.0 języka C# [1] [8]
- Wprowadzenie LINQ ("query expressions") [1] [8]
- Wprowadzenie wyrażeń lambda [1] [8]
- Wprowadzenie "extension methods" [1] [8]
- Wprowadzenie typów anonimowych [1] [8]
- Wprowadzenie "auto-implemented properties" [2] [8]
- Wprowadzenie drzew wyrażeń [8]
- Wprowadzenie "implicitly typed local variables" [8]
- Wprowadzenie "partial methods" [8]
- Wprowadzenie "object initializers" i "collection initializers" [8]
2007-03-20
- Wydanie ostatniej wersji oprogramowania DotGNU (0.8.0) [5]
2010
- Wydanie wersji 4.0 języka C# [1]
- Wprowadzenie wiązania dynamicznego (ang. dynamic binding) [8]
- Wprowadzenie argumentów nazwanych i opcjonalnych [8]
- Wprowadzenie generycznej kowariancji i kontrawariancji [8]
- Wprowadzenie "embedded interop types" [8]
2011-10-19
- Wydanie wersji CTP oprogramowania .NET Compiler Platform (Roslyn) [7] [11]
- Wprowadzenie nowego typu pliku, "C# Script File" (o rozszerzeniu
csx) [11] - Pojawienie się
rcsi.exe[11] - Przepisanie kompilatora C# z C++ na C# [12]
- Wprowadzenie okna "C# Interactive" w Visual Studio [12]
- Wprowadzenie nowego typu pliku, "C# Script File" (o rozszerzeniu
2013 lub wcześniej
- Wydanie wersji 5.0 języka C# [1]
- Wprowadzenie "asynchronous members" [8]
- Wprowadzenie "caller info attributes" [8]
2014
- Wydanie oprogramowania RemObjects C# [6]
2014-03-18 lub wcześniej
- Udostępnienie kodu projektu Roslyn jako open-source [7] [13]
2015-07
- Wydanie wersji 6.0 języka C# [1]
- Wprowadzenie "static imports" [8]
- Wprowadzenie "exception filters" [8]
- Wprowadzenie "auto-property initializers" [8]
- Wprowadzenie "expression bodied members" [8]
- Wprowadzenie "null propagator" [8]
- Wprowadzenie interpolowanych ciągów znaków ("string interpolation") [8]
- Wprowadzenie operatora
nameof[8] - Wprowadzenie "index initializers" [8]
2017-03
- Wydanie wersji 7.0 języka C# [1]
- Wprowadzenie krotek (ang. tuples) [1] [8]
- Wprowadzenie funkcji lokalnych (ang. local functions) [1] [8]
- Wprowadzenie dopasowania do wzorca (ang. pattern matching) [1] [8]
- Wprowadzenie "declaration patterns" [15]
- Wprowadzenie "constant patterns" [15]
- Wprowadzenie "var patterns" [15]
- Wprowadzenie "out variables" [8]
- Wprowadzenie "expanded expression bodied members" [8]
- Wprowadzenie "ref locals" i wartości zwracanych przez referencję (ang. reference return values, ref returns) [8] [29] [31]
- Wprowadzenie "discards" [8]
- Wprowadzenie składni
_? [24]
- Wprowadzenie składni
- Wprowadzenie "Binary Literals" i "Digit Separators" [8]
- Wprowadzenie wyrażeń
throw(ang.throwexpressions) [8]
2017-08
- Wydanie wersji 7.1 języka C# [1]
- Wprowadzenie "language version selection configuration element" [8]
- Umożliwienie metodzie
Mainposiadania modyfikatoraasync[8] - Wprowadzenie "default literal expressions" [8]
- Wprowadzenie "inferred tuple element names" [8]
- Umożliwienie dopasowania do wzorca w przypadku parametrów o typach generycznych [8]
- Wprowadzenie nowych opcji kompilatora [8]
- Wprowadzenie opcji kompilatora
-refout[8] - Wprowadzenie opcji kompilatora
-refonly[8]
- Wprowadzenie opcji kompilatora
- Rozpoczęcie wydawania "point releases" języka C# [8]
2017-11
- Wydanie wersji 7.2 języka C# [1]
- Wprowadzenie "initializers on
stackallocarrays" [8] - "Use fixed statements with any type that supports a pattern" [8]
- "Access fixed fields without pinning" [8]
- Redesign "
reflocal variables" [8] - "Declare
readonly structtypes, to indicate that a struct is immutable and should be passed as aninparameter to its member methods" [8] - "Add the
inmodifier on parameters, to specify that an argument is passed by reference but not modified by the called method" [8] - "Use the
ref readonlymodifier on method returns, to indicate that a method returns its value by reference but doesn't allow writes to that object" [8] - "Declare
ref structtypes, to indicate that a struct type accesses managed memory directly and must always be stack allocated" [8] - "Use additional generic constraints" [8]
- "Named arguments can be followed by positional arguments" [8]
- "Numeric literals can now have leading underscores before any printed digits" [8]
- "Private protected access modifier" [8]
- Wprowadzenie warunkowych wyrażeń
ref(ang. conditionalrefexpressions) [8]
- Wprowadzenie "initializers on
2017-12
- Przyjęcie piątego wydania standardu ECMA-334 (wersja 5.0 języka C#) [1] [27]
2018 lub wcześniej
- Wycofanie standardu ISO/IEC 23270:2006 [1]
- Przyjęcie standardu ISO/IEC 23270:2018 [1]
2018
- Przyjęcie standardu ISO/IEC dla wersji 5.0 języka C# [1]
- Wydanie wersji 7.3 języka C# [1]
- "You can access fixed fields without pinning" [8]
- "You can reassign
reflocal variables" [8]- Wprowadzenie operatora
= ref? [32]
- Wprowadzenie operatora
- Umożliwienie zmiennej iteracyjnej w instrukcji
foreachbycia "ref local" lub "ref readonly local" [31] - "You can use initializers on
stackallocarrays" [8] - "You can use
fixedstatements with any type that supports a pattern" [8] - "You can use more generic constraints" [8]
- "You can test == and != with tuple types" [8]
- "You can use expression variables in more locations" [8]
- "You may attach attributes to the backing field of auto-implemented properties" [8]
- "Method resolution when arguments differ by in has been improved" [8]
- "Overload resolution now has fewer ambiguous cases" [8]
- Wprowadzenie nowych opcji kompilatora [8]
- Wprowadzenie opcji kompilatora
-publicsign[8] - Wprowadzenie opcji kompilatora
-pathmap[8]
- Wprowadzenie opcji kompilatora
- Wprowadzenie nowych ograniczeń
- Wprowadzenie ograniczenia
unmanaged[10] [18] [30] - Wprowadzenie ograniczeń
System.DelegateiSystem.MulticastDelegate[18] [30] - Wprowadzenie ograniczenia
System.Enum[18] [30]
- Wprowadzenie ograniczenia
2018-07-19 lub wcześniej
- Wprowadzenie wsparcia dla C# 7.3 w wersji EAP oprogramowania ReSharper 2018.2 [30]
- Wprowadzenie wsparcia dla C# 7.3 w wersji EAP oprogramowania Rider 2018.2 [30]
2018-12
- Opublikowanie standardu ISO/IEC 23270:2018 [28]
2019-09
- Wydanie wersji 8.0 języka C# ("first major C# release that specifically targets .NET Core") [1] [8]
- Umożliwienie deklarowania składowych struktury jako "tylko do odczytu" (
readonly) [8] [9] - Wprowadzenie "default interface methods" [8]
- Wprowadzenie wyrażeń
switch? [8] [9] [15]- Odwrotna kolejność: zmienna przed słowem kluczowym
switch? [9] - Operator?
=>zamiastcasei:? [9] _zamiastdefault? [9]- Ciało? wyrażenia
switchjest wyrażeniem, nie instrukcją? [9?]
- Odwrotna kolejność: zmienna przed słowem kluczowym
- Rozwinięcie dopasowania do wzorca ("more patterns in more places" [9]) [9]
- Wprowadzenie "tuple patterns"? [8]
- Wprowadzenie "discard patterns" (
_) [15] - Wprowadzenie wzorców rekursywnych (ang. recursive patterns) [9] [15]
- Wprowadzenie "positional patterns" [8] [9] [15]
- Wprowadzenie "property patterns" [8] [9] [15]
- Wprowadzenie deklaracji
using[8] - Wprowadzenie statycznych funkcji lokalnych [8]
- Umożliwienie zwolnienia (ang. dispose) struktur deklarowanych przy użyciu słowa kluczowego
ref[8] - "Nullable reference types"? [8] [9]
- Umożliwienie asynchronicznych działań na strumieniach [8] [9]
- Wprowadzenie asynchronicznych "disposable types" [9]
- Wprowadzenie "indeksów" (ang. indices) i "zakresów" (ang. ranges) [8]
- Wprowadzenie typu
System.Index[9] - Wprowadzenie typu
System.Range[9] - Wprowadzenie operatora
^[9] - Wprowadzenie operatora
..(dwie kropki) [9]
- Wprowadzenie typu
- Wprowadzenie przypisania "null-coalescing" [8]
- Wprowadzenie operatora przypisania "null-coalescing" (
??=) [9]
- Wprowadzenie operatora przypisania "null-coalescing" (
- Określenie, że te typy strukturowe będące "constructed", które zawierają pola o typach będących "unmanaged", są "unmanaged" [8] [9] [10]
- Umożliwienie użycia wyrażenia
stackallocw wyrażeniach zagnieżdżonych [8] [9] - Umożliwienie umieszczania tokenów
$i@w dowolnej kolejności w interpolowanych dosłownych ciągach znaków (ang. interpolated verbatim strings), podczas gdy wcześniej trzeba było umieszczać token$przed tokenem@[8] [9] [22] - Rozwinięcie ograniczeń (ang. constraints) argumentów będących typem [18]
- Wprowadzenie ograniczenia
notnull? [18] - Zmiana ograniczeń
classi<nazwa klasy bazowej>tak, że w kontekście "nullable" dany typ musi być typem referencyjnym, który jest "non-nullable" [18] - Zmiana ograniczenia
<nazwa interfejsu>tak, że w kontekście "nullable" dany typ musi być typem, który jest "non-nullable" [18] - Zmiana ograniczenia
<base class name>?tak, że w kontekście "nullable" dany typ może być albo "nullable", albo "non-nullable" [18] - Zmiana ograniczenia
<interface name>?tak, że w kontekście "nullable" dany typ może być albo typem referencyjnym, który jest "nullable", albo typem referencyjnym, który jest "non-nullable", albo nie "nullable" typem wartościowym ("Tmay not be a nullable value type" [18]) [18] - Zmiana ograniczenia
default? [18]
- Wprowadzenie ograniczenia
- Umożliwienie deklarowania składowych struktury jako "tylko do odczytu" (
2020-11
- Wydanie wersji 9.0 języka C# [1]
- Wprowadzenie setterów "init-only" [3] [8] [14]
- Wprowadzenie słowa kluczowego
init? [3]
- Wprowadzenie słowa kluczowego
- Wprowadzenie "record types" [4] [8] [14]
- Wprowadzenie słowa kluczowego
record? [14]
- Wprowadzenie słowa kluczowego
- Wprowadzenie wyrażeń
with[1] - Wprowadzenie "top-level statements" [1] [8]
- Rozwinięcie dopasowania do wzorca [1]
- Wprowadzenie nowych wzorców [15]
- Wprowadzenie "type patterns" [15]
- Wprowadzenie "relational patterns" [15]
- Wprowadzenie "logical patterns" (
not,and,or) [15]
- Umożliwienie obejmowania wzorców w nawiasy [15]
- Wprowadzenie nowych wzorców [15]
- Poprawa wydajności i "interop" [8]
- Wprowadzenie "native sized integers" [8]
- Wprowadzenie typu
nint[14] - Wprowadzenie typu
nuint[14]
- Wprowadzenie typu
- Wprowadzenie "function pointers" [8]
- Wprowadzenie możliwości wyłączenia emitowania flagi
localsinitprzez kompilator (przez dodanie atrybutuSystem.Runtime.CompilerServices.SkipLocalsInitAttribute) [8]
- Wprowadzenie "native sized integers" [8]
- "Fit and finish features"? [8]
- Zmiana? wyrażeń
newna "target-typed" (tj. umożliwienie pominięcia typu w wyrażeniunew) [1] [8] [16] - Umożliwienie deklarowania wyrażeń lambda oraz metod anonimowych jako statyczne [14] ("
staticanonymous functions"? [8]) - Zmiana wyrażeń warunkowych na "target-typed" (tj. zniesienie wymogu niejawnej konwersji danych dwóch wyrażeń między sobą? [14], a wprowadzenie wymogu konwertowalności do "target type", jeśli ów jest znany? [17]) [8]
- Wprowadzenie "covariant return types" [1] [8]
- Umożliwienie pętli
foreachrozpoznawania metodyGetEnumerator()? ("(…) the foreach loop will recognize and use an extension methodGetEnumeratorthat otherwise satisfies theforeachpattern" [14]) [8] [14] - Umożliwienie wykorzystania "discards" jako parametrów wejściowych wyrażenia lambda [8] [24]
- Umożliwienie nadawania atrybutów funkcjom lokalnym [8]
- Zmiana? wyrażeń
- Rozwinięcie "code generators" [8]
- Wprowadzenie "module initializers" [8] [14]
- Wprowadzenie atrybutu
ModuleInitializerAttribute? [14]
- Wprowadzenie atrybutu
- Zniesienie części ograniczeń metod częściowych [8] [14]
- Wprowadzenie "module initializers" [8] [14]
- Bycie przez wersję 9.0 języka C# "the default language version for any assembly that targets the .NET 5 release" [8]
- Wprowadzenie setterów "init-only" [3] [8] [14]
2021-11-08
- Wydanie wersji 10.0 języka C# [1]
- Wprowadzenie typów
record struct("record structs") [8] [20] - Rozwinięcie struktur [8]
- Umożliwienie deklaracji bezparametrowego konstruktora instancji (ang. instance parameterless constructor) w strukturze i inicjalizacji pola lub właściwości instancji przy tej deklaracji [19]
- Rozwinięcie wyrażeń
with- Umożliwienie lewemu operandowi wyrażenia
withbycia typu strukturowego lub anonimowego [21]
- Umożliwienie lewemu operandowi wyrażenia
- Wprowadzenie "interpolated string handlers"? ("(…) when an interpolated string is used, the compiler checks if the interpolated string is assigned to a type that satisfies the interpolated string handler pattern" [22]) [8] [22]
- Wprowadzenie "global using directives" [8]
- Wprowadzenie deklaracji przestrzeni nazw o zasięgu pliku [8] [23]
- Wprowadzenie składni
namespace <nazwa przestrzeni nazw>;[19]
- Wprowadzenie składni
- "Extended property patterns" [8]
- "(…) you can reference nested properties or fields within a property pattern"? [15]
- Wprowadzenie składni
{ <właściwość>.<właściwość zagnieżdżona>: <wzorzec> }? [19]
- Rozwinięcie wyrażeń lambda [8]
- Umożliwienie typowi wyrażenia lambda bycia "natural type" [25]
- Umożliwienie wyrażeniom lambda i ich parametrom posiadania atrybutów [25]
- Umożliwienie deklaracji typu zwracanego w wyrażeniach lambda? [25]
- Umożliwienie interpolacji stałych ciągów znaków [8] [19]
- Umożliwienie zamknięcia (zapieczętowania, ang. seal) nadpisanej? metody
ToString()w "record types" [8] [19] - Ulepszenie "definite assignment" [8]
- Umożliwienie jednoczesnego przypisania i deklaracji podczas dekonstrukcji (ang. deconstruction) (np.
(jakasZmienna1, int jakasZmienna2) = jakisObiekt;) [8] [19] - Umożliwienie metodom posiadania atrybutu
AsyncMethodBuilder? [8] - Wprowadzenie atrybutu
System.Runtime.CompilerServices.CallerArgumentExpression? [8] - Wprowadzenie nowej składni dyrektywy
#line[8] [19] - "C# 10 also marks more of a shift to the yearly cadence for .NET releases"? [8]
- Wprowadzenie typów
2022-02-22
- Wydanie preview wersji 11 języka C# [8?]
- Umożliwienie deklaracji pochodnej klasy generycznej, której klasą bazową jest klasa
System.Attribute[26] - Umożliwienie definicji statycznych abstrakcyjnych składowych interfejsu [26]
- Umożliwienie wieloliniowego zapisu wyrażeń użytych do interpolacji ciągu znakowego [22] [26]
- Umożliwienie kompilatorowi ponownego wykorzystania delegatu w przypadku "method group conversion" [26]
- Wprowadzenie surowych ciągów znaków (ang. raw string literals) [26]
- Umożliwienie deklaracji pochodnej klasy generycznej, której klasą bazową jest klasa
Źródła
- C Sharp (programming language)
- Auto-Implemented Properties (C# Programming Guide)
- init (C# Reference)
- C# 9.0 on the record
- DotGNU
- RemObjects Software
- Roslyn (compiler)
- The history of C#
- What's new in C# 8.0
- Unmanaged types (C# reference)
- Introducing the Microsoft “Roslyn” CTP
- Roslyn CTP Now Available
- Roslyn.Says("Hello World");
- What's new in C# 9.0
- Patterns (C# reference)
- C# 9.0: Target-typed New Expressions – Make Your Initialization Code Less Verbose
- ?: operator (C# reference)
- Constraints on type parameters (C# Programming Guide)
- What's new in C# 10
- Records (C# reference)
- with expression (C# reference)
- $ - string interpolation (C# reference)
- namespace
- Discards - C# Fundamentals
- Lambda expressions (C# reference)
- What's new in C# 11
- ECMA-334
- ISO/IEC 23270:2003
- Ref returns and ref locals
- Unmanaged, delegate and enum type constraints – C# 7.3 in Rider and ReSharper
- ref (C# Reference)
- Assignment operators (C# reference)
- Create Elegant Code With Anonymous Methods, Iterators, And Partial Classes