C#8.0의 새로운 특성 개요 및 설명

카탈로그

  • 머리말
  • 새로운 변화
  • 비어 있는 참조 유형(Nullable reference types)
  • Async streams)
  • 범위 및 아래 첨자 유형(Ranges and indices)
  • 인터페이스의 기본 구현 방법(Default implementations of interface members)
  • 패턴 일치 표현식과 귀속 패턴 문장(Switch expressions and recursive patterns)
  • 목표 유형 유도(Target-typed new-expressions)
  • 참고 사항
  • 몇 가지 생각
  • 참고 문헌
  • 앞말


    2018년 11월 12일 마이크로소프트는 MSDN 블로그의 Building C#8.01에 새로운 C#8.0이 곧 발표될 특성을 발표했다.

    새로운 변화

  • 비어 있는 참조 유형
  • 비동기식 흐름
  • 범위 및 아래 첨자 유형
  • 인터페이스 구성원의 기본 구현
  • 패턴 일치 표현식과 귀속 모드 문장
  • 목표 유형 유도
  • 비어 있는 참조 유형(Nullable reference types)


    따라서 참조 유형은 구분 가능 여부를 구분하여 Null Reference Exception을 근원적으로 해결할 수 있습니다.그러나 이 특성은 호환성을 깨뜨릴 수 있기 때문에 error로 취급하지 않고 Warning 절충을 사용하고 개발자는 수동opt-in을 사용해야 이 특성을 사용할 수 있다(프로젝트 등급이나 파일 등급에서 설정할 수 있다).예:
    string s = null; //  :   null
    string? s = null; // Ok
    
    void M(string? s)
    {
        Console.WriteLine(s.Length); //  :  null
        if (s != null)
        {
            Console.WriteLine(s.Length); // Ok
        }
    }

    이로써 엄마는 더 이상 내 프로그램이 여기저기 Null Reference Exception에 보고되는 것을 걱정할 필요가 없다.

    비동기식 흐름(Async streams)


    대부분의 Api와 함수 구현에 대응하는 async 버전이 있는 것을 감안하면 IEnumerableIEnumerator 아직 편리하게 사용할 수 없음 async/await 은 번거롭다.그러나 이제는 비동기류를 도입해 이 문제들이 해결됐다.우리는 새로운 IAsyncEnumerableIAsyncEnumerator 을 통해 이 점을 실현한다.또한 이전foreachIEnumerable를 바탕으로 이루어졌기 때문에 새로운 문법IEnumerator을 도입하여 await foreach의 적용성을 확장했다.예:
    async Task<int> GetBigResultAsync()
    {
        var result = await GetResultAsync();
        if (result > 20) return result; 
        else return -1;
    }
    
    async IAsyncEnumerable<int> GetBigResultsAsync()
    {
        await foreach (var result in GetResultsAsync())
        {
            if (result > 20) yield return result; 
        }
    }

    범위 및 아래 첨자 유형(Ranges and indices)


    C#8.0은 인덱스 형식을 도입하여 그룹 아래 표시로 사용할 수 있으며, ^ 조작부호를 사용하여 역수를 표시합니다.그러나 주의해야 할 것은 카운트다운은 1부터 시작한다는 것이다.
    Index i1 = 3;  //   3
    Index i2 = ^4; //   4  
    int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

    이외에도 "..."조작부호는 범위를 나타내는 데 쓰인다.
    var slice = a[i1..i2]; // { 3, 4, 5 }

    이 하표는 0부터 시작하고 역수는 1부터 시작하며 범위는 왼쪽에서 오른쪽으로 닫는다. 필자는 처음에는 이상하다고 생각했지만Python 등 언어는 이미 이런 실천을 했고 효과가 좋다는 것을 발견했다.그래서 이번에도 마이크로소프트는 이런 방식으로 C#8.0의 이 문법을 설계했다.

    인터페이스의 기본 구현 방법(Default implementations of interface members)


    이 인터페이스에는 다음이 포함될 수 있습니다.
    interface ILogger
    {
        void Log(LogLevel level, string message);
        void Log(Exception ex) => Log(LogLevel.Error, ex.ToString()); //  
    }
    
    class ConsoleLogger : ILogger
    {
        public void Log(LogLevel level, string message) { ... }
        // Log(Exception)  
    }

    위의 예에서 foreach 는 기본적으로 실행될 것입니다.

    패턴 일치 표현식과 귀속 패턴 문장(Switch expressions and recursive patterns)


    이제 이렇게 써도 돼요.
    IEnumerable<string> GetEnrollees()
    {
        foreach (var p in People)
        {
            if (p is Student { Graduated: false, Name: string name }) yield return name;
        }
    }
    Log(Exception) p가 Student { Graduated: false, Name: string name }Graduated = false Namestring 인지 확인하고 반복 반환Student.이렇게 써도 되니까 시원하지 않아요?
    더욱
    var area = figure switch 
    {
        Line _      => 0,
        Rectangle r => r.Width * r.Height,
        Circle c    => c.Radius * 2.0 * Math.PI,
        _           => throw new UnknownFigureException(figure)
    };

    전형적인 패턴은 문장과 일치하지만 "match"키워드가 아니라 "switch"키워드를 사용했다.하지만 어쩔 수 없이 한 글자, 시원해!

    대상 유형 유도(Target-typed new-expressions)


    이전에 우리가 아래의 변수/구성원 성명을 썼을 때 아마도 가장 간단한 방법은 다음과 같다.
    var points = new [] { new Point(1, 4), new Point(2, 6) };
    
    private List<int> _myList = new List<int>();

    이제 우리는 이렇게 쓸 수 있다.
    Point[] ps = { new (1, 4), new (3,-2), new (9, 5) };
    
    private List<int> _myList = new ();

    더 편해졌죠?

    주의사항

  • 이상의 새로운 특성이 필요합니다.NET Standard 2.1/.NET Core 3.0/.NET Framework 4.8 이상을 지원합니다.
  • 단, 인터페이스의 기본 실현 방법 때문에 이 기능은 CLR의 지원이 필요합니다.NET Framework 4.8이 아직 수정되지 않았기 때문에 이 기능은 에 있습니다.NET Framework 4.8에서는 사용할 수 없으며 추가 업데이트를 기다려야 합니다.
  • C#8.0은 발문까지 정형화되었다고 할 수 있으며, 정식 발표는 좀 더 기다려야 한다.

  • 약간의 생각

  • 이번 C#8.0 업데이트에서 Record2는 비둘기에 걸릴 것 같아서 약간의 유감입니다.
  • C#는 자신의 문법 체계를 끊임없이 보완하고 보완해 왔다. 이것은 정부가 제시한 C#의 발전 목표와 같다. 즉, 각종 우수하고 현대적인 문법 특성을 끊임없이 수용하고 다양화를 추구하는 것이다.이 우수한 언어가 미래에 우리에게 더 많은 기쁨을 가져다 줄 것이라고 믿는다.모두가 낡은 견해를 가지고 이 언어를 대하지 않기를 바랍니다. 8012년이 되었는데도 우리는 새로운 자세로 이 언어를 살펴보고 새로운 문법이 인코딩 효율에 가져오는 대폭적인 향상을 시도해야 합니다.
  • C#의 IDE는 Visual Studio 외에도 Visual Studio for Mac과 크로스 플랫폼의 Visual Studio Code, JetBrain에서 제작한 Rider 크로스 플랫폼 C# IDE가 있어 개발자의 편의를 극대화시켰다.
  • 최근 몇 년 동안의 발전을 보면 마이크로소프트는 개원, 생태 건설, 개발자, 지역사회, 크로스플랫폼 등에 대한 중시도가 끊임없이 상승하고 있다고 믿는다.NET Core의 전망은 더욱 좋아질 것이다.

  • 참고 문헌


    https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0 ↩︎
    https://github.com/dotnet/csharplang/issues/39 ↩︎

    좋은 웹페이지 즐겨찾기