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
Dispose
przez kod wygenerowany w pętliforeach
na 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.throw
expressions) [8]
2017-08
- Wydanie wersji 7.1 języka C# [1]
- Wprowadzenie "language version selection configuration element" [8]
- Umożliwienie metodzie
Main
posiadania 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
stackalloc
arrays" [8] - "Use fixed statements with any type that supports a pattern" [8]
- "Access fixed fields without pinning" [8]
- Redesign "
ref
local variables" [8] - "Declare
readonly struct
types, to indicate that a struct is immutable and should be passed as anin
parameter to its member methods" [8] - "Add the
in
modifier on parameters, to specify that an argument is passed by reference but not modified by the called method" [8] - "Use the
ref readonly
modifier on method returns, to indicate that a method returns its value by reference but doesn't allow writes to that object" [8] - "Declare
ref struct
types, 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. conditionalref
expressions) [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
ref
local variables" [8]- Wprowadzenie operatora
= ref
? [32]
- Wprowadzenie operatora
- Umożliwienie zmiennej iteracyjnej w instrukcji
foreach
bycia "ref local" lub "ref readonly local" [31] - "You can use initializers on
stackalloc
arrays" [8] - "You can use
fixed
statements 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.Delegate
iSystem.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?
=>
zamiastcase
i:
? [9] -
_
zamiastdefault
? [9] - Ciało? wyrażenia
switch
jest 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
stackalloc
w 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ń
class
i<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 ("T
may 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
localsinit
przez kompilator (przez dodanie atrybutuSystem.Runtime.CompilerServices.SkipLocalsInitAttribute
) [8]
- Wprowadzenie "native sized integers" [8]
- "Fit and finish features"? [8]
- Zmiana? wyrażeń
new
na "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] ("
static
anonymous 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
foreach
rozpoznawania metodyGetEnumerator()
? ("(…) the foreach loop will recognize and use an extension methodGetEnumerator
that otherwise satisfies theforeach
pattern" [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
with
bycia 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