C#의 역사

이 문서에서는 C# 언어의 각 주요 릴리스에 대한 기록을 제공합니다. C# 팀은 계속해서 새로운 기능을 혁신하고 추가하고 있습니다. 예정된 릴리스에서 고려되는 기능을 비롯한 자세한 언어 기능 상태는 GitHub의 dotnet/roslyn 리포지토리에서 확인할 수 있습니다.

Important

C # 언어는 C# 사양이 일부 기능에 대해 표준 라이브러리로 정의하는 형식 및 메서드를 사용합니다. .NET 플랫폼은 다양한 패키지에서 이러한 유형과 메서드를 제공합니다. 한 가지 예는 예외 처리입니다. 모든 throw 문 또는 식은 throw된 개체가 Exception에서 파생되는지 확인합니다. 마찬가지로 모든 catch는 발견되는 형식이 Exception에서 파생되는지 확인합니다. 각 버전은 새 요구 사항을 추가할 수 있습니다. 이전 환경에서 최신 언어 기능을 사용하려면 특정 라이브러리를 설치해야 합니다. 이러한 종속성은 각 특정 버전에 대한 페이지에서 설명합니다. 이 종속성의 배경은 언어 및 라이브러리 간 관계에서 자세히 알아볼 수 있습니다.

C# 버전 11

2022년 11월 릴리스

C# 11에는 다음 기능이 추가되었습니다.

C# 11에는 제네릭 수학과 해당 목표를 지원하는 여러 기능이 도입되었습니다. 모든 숫자 형식에 대해 숫자 알고리즘을 한 번 작성할 수 있습니다. 필수 멤버 및 자동 기본 구조체와 같이 struct 형식 작업을 더 쉽도록 하는 더 많은 기능이 있습니다. 원시 문자열 리터럴, 문자열 보간의 개행 및 UTF-8 문자열 리터럴을 사용하면 문자열 작업이 더 쉬워집니다. 파일 로컬 형식과 같은 기능을 사용하면 원본 생성기를 더 간단하게 만들 수 있습니다. 마지막으로 목록 패턴은 패턴 일치에 대한 지원을 추가합니다.

C# 버전 10

2021년 11월 릴리스

C# 10에는 다음과 같은 기능과 C# 언어 개선 사항이 추가되었습니다.

미리 보기 모드에서는 더 많은 기능을 사용할 수 있습니다. 이러한 기능을 사용하려면 프로젝트에서 <LangVersion>Preview로 설정해야 합니다.

C# 10에서는 의식 제거, 알고리즘에서 데이터 분리, .NET 런타임 성능 개선이라는 주제에 대한 작업을 계속하고 있습니다.

많은 기능을 사용하면 동일한 개념을 표현하기 위해 더 적은 코드를 입력하게 됩니다. 레코드 구조체레코드 클래스가 수행하는 것과 동일한 여러 메서드를 합성합니다. 구조체와 무명 형식은 식 포함을 지원합니다. 전역 사용 지시문파일 범위 네임스페이스 선언을 사용하면 종속성과 네임스페이스 구성을 더 명확하게 표현할 수 있습니다. 람다 개선을 통해 사용되는 람다 식을 더 쉽게 선언할 수 있습니다. 새로운 속성 패턴과 분해 개선으로 더욱 간결한 코드가 만들어집니다.

새로운 보간된 문자열 처리기와 AsyncMethodBuilder 동작은 성능을 개선할 수 있습니다. 이러한 언어 기능은 .NET 6의 성능 개선을 위해 .NET 런타임에 적용되었습니다.

C# 10에서는 .NET 릴리스의 연간 주기가 더 많이 바뀌었습니다. 모든 기능을 연간 시간 프레임 내에 완료할 수는 없으므로 C# 10에서 몇 가지 "미리 보기" 기능을 사용해 볼 수 있습니다. 제네릭 특성인터페이스의 정적 추상 멤버를 모두 사용할 수 있지만 이러한 미리 보기 기능은 최종 릴리스 전에 변경될 수 있습니다.

C# 버전 9

2020년 11월 릴리스

C# 9는 .NET 5와 함께 릴리스되었습니다. .NET 5 릴리스를 대상으로 하는 모든 어셈블리의 기본 언어 버전입니다. 여기에는 다음과 같은 새롭고 향상된 기능이 포함되어 있습니다.

C# 9는 이전 릴리스의 세 가지 테마인 공식 제거, 알고리즘에서 데이터 분리, 더 많은 위치에서 더 많은 패턴 제공을 계속합니다.

최상위 문은 기본 프로그램을 읽기가 더 간단하다는 것을 의미합니다. 공식 업무에는 네임스페이스, Program 클래스 및 static void Main()이 모두 필요하지 않습니다.

records의 도입은 같음의 값 의미 체계를 따르는 참조 형식에 대한 간결한 구문을 제공합니다. 이러한 형식을 사용하여 일반적으로 최소한의 동작을 정의하는 데이터 컨테이너를 정의합니다. Init 전용 setter는 레코드에서 비파괴적 변경(with 식)에 대한 기능을 제공합니다. 또한 C# 9는 파생 레코드가 가상 메서드를 재정의하고 기본 메서드의 반환 형식에서 파생된 형식을 반환할 수 있도록 공변 반환 형식을 추가합니다.

패턴 일치 기능은 여러 가지 방법으로 확장되었습니다. 숫자 형식은 이제 범위 패턴을 지원합니다. 패턴은 and, ornot 패턴을 사용하여 결합할 수 있습니다. 더 복잡한 패턴을 명확하게 하기 위해 괄호를 추가할 수 있습니다.

C# 9에는 새로운 패턴 일치 개선 사항이 포함되어 있습니다.

  • 형식 패턴은 개체와 일치하고 특정 형식과 일치합니다.
  • 괄호로 묶인 패턴은 패턴 조합의 우선 순위를 적용하거나 강조합니다.
  • 결합 and 패턴은 두 패턴이 모두 일치해야 합니다.
  • 분리 or 패턴은 패턴 중 하나가 일치해야 합니다.
  • 부정 not 패턴에서는 패턴이 일치하지 않아야 합니다.
  • 관계형 패턴은 입력과 지정된 상수 간에 작음, 큼, 작거나 같음, 크거나 같음 또는 같음 관계가 있어야 합니다.

새로운 패턴은 패턴 구문을 보강합니다. 이 예제를 참조하십시오.

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

선택적 괄호를 사용하여 andor보다 높은 우선 순위가 있음을 명확하게 지정합니다.

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

가장 일반적인 용도 중 하나는 새로운 null 검사 구문입니다.

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

is 패턴 식, switch 식, 중첩 패턴, switch 문의 case 레이블 패턴 등 패턴이 허용되는 모든 컨텍스트에서 새로운 패턴을 사용할 수 있습니다.

다른 기능 집합은 C#에서 고성능 컴퓨팅을 지원합니다.

  • nintnuint 형식은 대상 CPU에서 네이티브 크기 정수 형식을 모델링합니다.
  • 함수 포인터는 대리자 개체를 만드는 데 필요한 할당을 방지하면서 대리자 같은 기능을 제공합니다.
  • localsinit 명령을 생략하여 명령을 저장할 수 있습니다.

성능 및 interop

다른 개선 사항 집합은 코드 생성기에서 기능을 추가하는 시나리오를 지원합니다.

  • 모듈 이니셜라이저는 어셈블리가 로드할 때 런타임에서 호출하는 메서드입니다.
  • 부분 메서드는 액세스 가능한 새 한정자 및 void가 아닌 반환 형식을 지원합니다. 이러한 경우 구현을 제공해야 합니다.

기능 마무리

C# 9는 코드 작성과 읽기 모두를 포함하여 개발자 생산성을 향상시키는 다른 많은 작은 기능을 추가합니다.

  • 대상으로 형식화된 new
  • static 익명 함수
  • 대상으로 형식화된 조건식
  • foreach 루프에 대한 확장 GetEnumerator() 지원
  • 람다 식은 무시 항목 매개 변수를 선언할 수 있습니다.
  • 로컬 함수에 특성을 적용할 수 있습니다.

C# 9 릴리스는 C#을 최신 범용 프로그래밍 언어로 유지하기 위한 작업을 계속합니다. 기능은 최신 워크로드 및 애플리케이션 유형을 계속 지원합니다.

C# 버전 8.0

2019년 9월 릴리스

C# 8.0은 특히 .NET Core C#을 대상으로 하는 첫 번째 주 릴리스입니다. 일부 기능은 새 CLR 기능을 사용하며, 다른 기능은 .NET Core에만 추가된 라이브러리 형식을 사용합니다. C#8.0은 다음 기능 및 향상된 기능을 C# 언어에 추가합니다.

기본 인터페이스 멤버에는 CLR의 향상된 기능이 필요합니다. 해당 기능은 .NET Core 3.0용 CLR에 추가되었습니다. 범위 및 인덱스와 비동기 스트림에는 .NET Core 3.0 라이브러리의 새 형식이 필요합니다. 인수 및 반환 값의 null 상태에 관한 의미 체계 정보를 제공하도록 라이브러리에 주석이 달린 경우 nullable 참조 형식은 컴파일러에서 구현되는 동안 훨씬 더 유용합니다. 해당 주석은 .NET Core 라이브러리에 추가됩니다.

C# 버전 7.3

2018년 5월 릴리스

C# 7.3 릴리스에는 두 개의 기본 테마가 있습니다. 하나의 테마는 안전한 코드의 성능을 안전하지 않은 코드만큼 향상할 수 있는 기능을 제공합니다. 두 번째 테마는 기존 기능에 대한 점진적인 개선을 제공합니다. 또한 새 컴파일러 옵션이 이 릴리스에 추가되었습니다.

다음 새로운 기능은 안전한 코드에 대해 향상된 성능의 테마를 지원합니다.

  • 고정하지 않고 고정 필드에 액세스할 수 있습니다.
  • ref 지역 변수를 다시 할당할 수 있습니다.
  • stackalloc 배열에서 이니셜라이저를 사용할 수 있습니다.
  • 패턴을 지원하는 모든 형식과 함께 fixed 문을 사용할 수 있습니다.
  • 더 많은 제네릭 제약 조건을 사용할 수 있습니다.

기존 기능이 다음과 같이 개선되었습니다.

  • 튜플 형식으로 ==!=를 테스트할 수 있습니다.
  • 더 많은 위치에서 식 변수를 사용할 수 있습니다.
  • 자동 구현 속성의 지원 필드에 특성을 연결할 수 있습니다.
  • 인수에서 in만 다른 경우 메서드 해결이 향상되었습니다.
  • 이제 오버로드 해결에 모호한 사례가 감소했습니다.

새 컴파일러 옵션은 다음과 같습니다.

  • -publicsign - OSS(오픈 소스 소프트웨어)가 어셈블리에 서명할 수 있도록 설정합니다.
  • -pathmap - 소스 디렉터리에 대한 매핑을 제공합니다.

C# 버전 7.2

2017년 11월 릴리스

C# 7.2는 몇 가지 작은 언어 기능을 추가했습니다.

  • stackalloc 배열의 이니셜라이저
  • 패턴을 지원하는 모든 형식과 함께 fixed 문을 사용합니다.
  • 고정하지 않고 고정 필드에 액세스합니다.
  • ref 지역 변수를 다시 할당합니다.
  • readonly struct 형식을 선언하여 구조체가 변경이 불가능하고 in 매개 변수로 멤버 메서드에 전달되어야 함을 나타냅니다.
  • 매개 변수에 in 한정자를 추가하여 인수가 참조로 전달되지만, 호출된 메서드에 의해 수정되지 않도록 지정합니다.
  • 메서드 반환에 ref readonly 한정자를 사용하여 메서드가 참조로 값을 반환하지만, 해당 개체에 대한 쓰기를 허용하지 않음을 나타냅니다.
  • ref struct 형식을 선언하여 구조체 형식이 관리되는 메모리에 직접 액세스하고 항상 스택에 할당되어야 함을 나타냅니다.
  • 추가 제네릭 제약 조건을 사용합니다.
  • 뒤에 오지 않는 명명된 인수
    • 명명된 인수 뒤에는 위치 인수가 올 수 있습니다.
  • 숫자 리터럴의 선행 밑줄
    • 숫자 리터럴은 이제 인쇄된 숫자 앞에 선행 밑줄이 있을 수 있습니다.
  • private protected 액세스 한정자
    • private protected 액세스 한정자는 동일한 어셈블리의 파생된 클래스에 대해 액세스를 사용합니다.
  • 조건부 ref
    • 이제 조건식(?:)의 결과가 참조일 수 있습니다.

C# 버전 7.1

2017년 8월 릴리스

C#은 C# 7.1과 함께 ‘포인트 릴리스’를 제공하기 시작했습니다. 이 버전은 언어 버전 선택 구성 요소, 세 개의 새로운 언어 기능 및 새로운 컴파일러 동작을 추가했습니다.

이 릴리스의 새로운 언어 기능은 다음과 같습니다.

  • asyncMain 메서드
    • 애플리케이션에 대한 진입점은 async 한정자를 가질 수 있습니다.
  • default 리터럴 식
    • 대상 형식을 유추할 수 있는 경우 기본 값 식에서 기본 리터럴 식을 사용할 수 있습니다.
  • 유추된 튜플 요소 이름
    • 튜플 요소의 이름은 대부분의 경우에 튜플 초기화에서 유추할 수 있습니다.
  • 제네릭 형식 매개 변수의 패턴 일치
    • 형식이 제네릭 형식 매개 변수인 변수에서 패턴 일치 식을 사용할 수 있습니다.

마지막으로 컴파일러에는 참조 어셈블리 생성을 제어하는 두 가지 옵션 -refout-refonly가 있습니다.

C# 버전 7.0

2017년 3월 릴리스

C# 버전 7.0은 Visual Studio 2017과 함께 릴리스되었습니다. 이 버전에는 C# 6.0과 유사한 몇 가지 혁신적이고 멋진 기능이 포함되어 있습니다. 다음은 새 기능 중 일부입니다.

이러한 기능에는 다음이 포함됩니다.

이러한 모든 기능은 개발자에게 새로운 기능을 제공하고 그 어느 때보다 깔끔한 코드를 작성할 수 있는 기회를 제공합니다. 하이라이트는 out 키워드와 함께 사용할 변수의 선언을 압축하고 튜플을 통해 여러 개의 반환 값을 허용하는 것입니다. .NET Core는 이제 모든 운영 체제를 대상으로 하며 클라우드와 휴대성에 확실히 집중하고 있습니다. 이는 새로운 기능을 제공하는 것 외에도 언어 디자이너가 많이 생각하고 시간을 투자하게 만듭니다.

C# 버전 6.0

2015년 7월 릴리스

Visual Studio 2015와 함께 릴리스된 버전 6.0에서는 C# 프로그래밍의 생산성을 높이는 여러 가지 작은 기능을 릴리스했습니다. 다음은 몇 가지 예입니다.

기타 새로운 기능은 다음과 같습니다.

  • 인덱스 이니셜라이저
  • Catch/Finally 블록의 Await
  • Getter 전용 속성의 기본값

이러한 각 기능은 그 자체로 흥미롭습니다. 그러나 전체적으로 살펴보면 흥미로운 패턴을 볼 수 있습니다. 이 버전에서 C#은 코드를 더 간결하고 읽기 쉽게 만들기 위해 언어 상용구를 제거하기 시작했습니다. 따라서 깔끔하고 간단한 코드를 좋아하는 사람들에게 이 언어 버전은 큰 선물이었습니다.

이 버전에는 또 다른 변화가 있지만 본질적으로 기존 언어 기능은 아닙니다. Roslyn 서비스형 컴파일러가 릴리스되었습니다. C# 컴파일러는 이제 C#으로 작성되며, 프로그래밍 작업의 일부로 컴파일러를 사용할 수 있습니다.

C# 버전 5.0

2012년 8월 릴리스

Visual Studio 2012과 함께 릴리스된 C# 버전 5.0은 언어에 중점을 둔 버전이었습니다. 해당 버전에 대한 거의 모든 노력은 다른 획기적인 언어 개념인 비동기 프로그래밍을 위한 asyncawait 모델로 옮겨 갔습니다. 다음은 주요 기능 목록입니다.

호출자 정보 특성을 사용하면 엄청난 양의 상용구 리플렉션 코드를 사용하지 않고도 실행 중인 컨텍스트에 대한 정보를 쉽게 검색할 수 있습니다. 진단 및 로깅 작업의 용도는 매우 다양합니다.

하지만 이 릴리스의 진정한 스타는 asyncawait입니다. 이러한 기능이 2012년에 출시되었을 때 C#은 언어에 첫 번째 클래스 참여자로 비동기를 적용하여 다시 업계의 판도를 바꾸었습니다. 장기 실행 작업 및 콜백 웹 구현을 처리한 적이 있다면 이 언어 기능을 좋아할 것입니다.

C# 버전 4.0

2010년 4월 릴리스

Visual Studio 2010과 함께 릴리스된 C# 버전 4.0은 버전 3.0의 혁신에 따른 기대에 부응하느라 어려움을 겪을 것으로 예상되었습니다. 이 버전에는 몇 가지 흥미로운 새로운 기능이 도입되었습니다.

포함 interop 형식은 애플리케이션에 대한 COM interop 어셈블리를 만들 때의 배포 불만을 줄어들게 합니다. 제네릭 공변성(Covariance)과 반공변성(Contravariance)은 제네릭을 사용하는 기능을 더 많이 제공하지만, 약간 학문적이며, 프레임워크와 라이브러리 작성자에게 가장 높은 평가를 받을 것입니다. 명명되고 선택적인 매개 변수를 사용하면 많은 메서드 오버로드를 제거하고 편리성을 제공할 수 있습니다. 그러나 이러한 기능 중 어느 것도 정확히 패러다임의 변화는 아닙니다.

주요 기능은 dynamic 키워드였습니다. dynamic 키워드는 C# 버전 4.0에 컴파일 시간에 컴파일러를 재정의하는 기능을 도입했습니다. 동적 키워드를 사용하면 JavaScript와 같이 동적으로 형식화된 언어와 유사한 구조를 만들 수 있습니다. dynamic x = "a string"을 만든 다음, 6을 추가하여 다음에 수행해야 할 작업을 런타임에 맡길 수 있습니다.

동적 바인딩은 오류를 유발할 수 있지만 언어 내에서 훌륭한 기능도 제공합니다.

C# 버전 3.0

2007년 11월 릴리스

C# 버전 3.0은 Visual Studio 2008과 함께 2007년말에 출시되었지만 언어 기능을 완전히 갖춘 버전은 .NET Framework 버전 3.5와 함께 제공됩니다. 이 버전은 C#의 성장에 큰 변화를 가져왔습니다. C#은 진정으로 강력한 프로그래밍 언어로 자리매김했습니다. 이 버전의 몇 가지 주요 특징을 살펴보겠습니다.

되돌아보면, 이러한 특징은 대부분 필연적이고 불가분한 것입니다. 이러한 모든 특징은 전략적으로 잘 맞습니다. C# 버전의 핵심 기능은 LINQ(Language-Integrated Query)라고도 하는 쿼리 식이라 생각됩니다.

더 미묘한 뷰는 LINQ가 생성되는 기반인 식 트리, 람다 식 및 익명 형식을 검사합니다. 하지만 두 경우 모두 C# 3.0은 혁신적인 개념을 제공합니다. C# 3.0은 C#을 하이브리드 개체 지향/기능 언어로 전환하기 위한 토대를 마련하기 시작했습니다.

특히, 이제 무엇보다도 컬렉션에 대한 작업을 수행할 수 있는 SQL 스타일의 선언적 쿼리를 작성할 수 있습니다. 정수 목록의 평균을 계산하는 for 루프를 작성하는 대신 이제 간단하게 list.Average()로 처리할 수 있습니다. 쿼리 식과 확장 메서드의 조합으로 정수 목록이 훨씬 더 스마트해졌습니다.

C# 버전 2.0

2005년 11월 릴리스

Visual Studio 2005와 함께 2005년에 릴리스된 C# 2.0의 몇 가지 주요 기능을 살펴보겠습니다.

기존 기능에 추가된 기타 C# 2.0 기능은 다음과 같습니다.

  • getter/setter 별도의 액세스 가능
  • 메서드 그룹 변환(대리자)
  • 정적 클래스
  • 대리자 유추

C#은 일반적인 OO(개체 지향) 언어로 시작되었지만 C# 버전 2.0을 통해 급격히 바뀌었습니다. 제네릭을 사용하면 형식을 안전하게 유지하면서 임의의 형식에서 형식 및 메서드를 작동할 수 있습니다. 예를 들어 List<T>를 사용하면 List<string> 또는 List<int>를 사용하고 이를 반복하는 동안 해당 문자열이나 정수에 형식이 안전한 작업을 수행할 수 있습니다. 모든 작업에서 ArrayList에서 파생된 ListInt 형식을 만들거나 Object에서 캐스팅하는 것보다 제네릭을 사용하는 것이 좋습니다.

C# 버전 2.0에서는 반복기라는 기능이 도입되었습니다. 간단히 말해서, 반복기를 사용하면 List(또는 다른 열거 가능 형식)의 모든 항목을 foreach 루프로 검사할 수 있습니다. 반복기를 언어의 첫 번째 클래스 부분에 사용하면 언어의 가독성과 사용자의 코드 추론 능력이 크게 향상됩니다.

그리고 이때까지 C#은 Java를 따라잡으려는 노력을 계속했습니다. Java는 이미 제네릭 및 반복기가 포함된 버전을 출시했습니다. 하지만 언어가 계속 발전함에 따라 곧 변경될 것입니다.

C# 버전 1.2

2003년 4월 릴리스

C# 버전 1.2는 Visual Studio .NET 2003과 함께 제공됩니다. 여기에는 언어에 대한 몇 가지 작은 개선이 포함되어 있습니다. 가장 주목할 만한 점은 이 버전부터 IEnumeratorIDisposable를 구현할 때 IEnumeratorDispose라는 foreach 루트에서 생성된 코드입니다.

C# 버전 1.0

2002년 1월 릴리스

돌이켜보면 Visual Studio.Net 2002와 함께 릴리스된 C# 버전 1.0은 Java와 매우 비슷했습니다. ECMA에 대해 명시된 설계 목표의 일부로 "단순하고 현대적인 범용 개체 지향 언어"를 추구했습니다. 당시에 Java와 같은 형태는 이러한 초기 설계 목표를 달성한 것을 의미했습니다.

그러나 지금 다시 C# 1.0을 돌이켜보면 조금 어지러워질 것입니다. 기본 제공 비동기 기능과 당연한 것으로 여겨지는 제네릭과 관련된 멋진 기능 중 일부가 부족했습니다. 사실, 제네릭이 아예 없었습니다. 그리고 LINQ는 아직 사용할 수 없습니다. 그러한 추가 사항은 나올 때까지 몇 년이 걸릴 것입니다.

C# 버전 1.0은 오늘날보다 기능이 없는 편이었습니다. 좀 더 자세한 코드를 작성해야 했습니다. 하지만 출발점이 필요했습니다. C# 버전 1.0은 Windows 플랫폼에서 Java를 대체하는 실용적인 방법이었습니다.

C# 1.0의 주요 기능에는 다음이 포함되어 있습니다.

아티클NDepend 블로그에 최초로 게시됨, Erik Dietrich 및 Patrick Smacchia 제공