C#11 기능이 유출되었습니다!마이크로소프트 최고의 크리스마스 선물?

지금은 이미 2021년 말(나는 여전히 2019년을 소화하고 있다)이다. 나는 우리가 모두 동의할 것이라고 생각한다. 이것은 매우 긴장되고 완전한 한 해이다. 예를 들어 C#10의 발표이다.NET6와 더 많은 것.그런데 C#11 기능이 이미 출시되었는데 어떻게 된 일입니까?Microsoft는 C#10을 한 달 전에 출시하지 않았습니까?
마이크로소프트는 정말 모든 C# 개발자를 위해 놀라운 선물을 준비했습니까?C#11 크리스마스 선물로?그렇다면 C# 11의 기능을 미리 살펴보겠습니다.
C#10은 Microsoft C# 프로그래밍 언어의 최신 버전입니다.그것은 초보자를 위해 설계된 배우기 쉬운 프로그래밍 언어로 간단성, 읽기 가능성과 생산성을 중시한다.
내가 이미 말했지만, 단지 네가 기억에 남도록 하기 위해서 C#10에서 제공한 몇 가지 기능은 다음과 같다.
  • 파일 범위의 네임스페이스 선언
  • 글로벌 사용 명령
  • 순환구조
  • 레코드 패브릭
  • 운반
  • lambda 표현식의 개선
  • 표준화 유형 및 데이터 구조
  • 이러한 기능은 C#10에서 구현되므로 애플리케이션 성능이 크게 향상되고 개발 비용과 시간이 절감됩니다.
    하지만 최근 C#11에서 무슨 일이 일어났는지, 그리고 왜 사람들이 그 일에 대해 이렇게 많이 이야기하는지 살펴봅시다.

    C#11은 무엇입니까?


    많은 사람들이 이미 알고 있는 바와 같이 마이크로소프트는 11월 초에 C#10을 발표하여 많은 새로운 혁신 기능을 가져와 C#를 더욱 통용되는 언어로 만들었다.그러나 며칠 전부터 C#11에 대한 루머가 인터넷에 퍼지기 시작했고 가능한 기능은 레딧의 한 게시물에 올라왔다. 그중에 changelog inMicrosoft's official Github이 언급됐다.이 기능들은 매우 재미있고 궁금해 보이기 때문에 분석해 보겠습니다.

    일반 속성


    이것은 첫 번째C# issues on GitHub에서 토론한 첫 번째 기능이다.마이크로소프트는 마지막 순간에 다른 도구와 호환되지 않는 문제 (붕괴와 컴파일 문제 포함) 를 만났는데, 이 유망한 기능에 문제가 생겼다.이 때문에 Microsoft는 C#10에서 이 기능을 공식 발표하지 않고 미리 보기 버전에서 발표했습니다.어떻게 작동하는지 살펴보겠습니다.
    Ashmind에서 그의 말로 설명한 바와 같다.

    "For some attributes (e.g. TypeConverterAttribute) that are used to reference types, the current usage looks like this:"


    [TypeConverter(typeof(X))]
    
    그의 말에 의하면 이 문제는 두 가지 결점이 있다.
  • 유형과 속성의 요구가 일치하지 않음 - e, g. 공구조 함수 또는 계승TypeConverter이 있다.
  • 문법이 좀 지루하다.
  • Ashmind에서는 모든 일반 구속조건을 포함하여 일반 속성을 지원하는 것이 좋습니다.다음 예는 다음과 같습니다.
    [TypeConverter<X>]
    
    네가 제기한 이 아주 좋은 건의에는 몇 가지 장점이 있다.그 자신의 말로:
  • 유형 참조 속성에서 유형 제약을 지원합니다.
  • 비교적 짧은 문법.
  • IL에서 공통 속성이 지원되는 것으로 알고 있습니다.
  • 제의하다 필드 키워드


    이것은 많은 C# 개발자들이 가장 좋아하는 기능입니다.우리는 줄곧 C#10의 미리보기에서 이 기능을 분석해 왔지만, 시간이 부족해서 정식으로 발표하지 않았지만, 그들은 C#11에서 이 기능이 발표될 것이며, 우리는 그것을 열정적으로 사용할 수 있을 것이라고 믿는 것 같다.
    Field 키워드를 이해하기 위해서 저는 의 해석을 사용할 것입니다. 이Lachbaer의 창립자는 제가 보기에 이것은 Field 키워드를 이해하는 가장 좋은 방법이기 때문입니다.

    "Create auto-properties that can also have getters and setters. These can access the automatically created backing field with the field keyword, that acts like a variable, as value does for properties."


    다음은 Lachbaer가 매우 간단한 예로 이 기능의 작동 원리를 설명한 것입니다.
    다음과 같은 경우 자동 지원 필드가 있는 반자동 속성이 작성됩니다.
  • 또는 get; 선언이 있어야 합니다
  • .
  • 이 속성은 초기값 설정 항목이 있음
  • 제의하다 구속


    public string PropertyConstraint {
        get;
        set => field = value ?? throw new ArgumentNullException();
    } = "";
    
    setter에서 구속을 정의했습니다.set;는 자동으로 생성된 지원 필드를 나타냅니다.자동 속성에서 지원 필드는 가능한 한 field에서 초기화됩니다.

    Getter 논리


    public T PropertyAssertedGet {
        int getCounter = 0;   // property scoped field #133
        get 
        {
            getCounter++;
            Debug.Assert (getCounter <= 3,
                  "In my code this prop is only called 3 times, somethings terribly wrong.");
            return field;
        }
        set;
    }
    

    모금


    public T PropertyEvent {
        get;
        set
        {
            var oldValue = field;
            OnPropertyChanging(
                new PropertyChangingEventArgs(/* current value */ oldValue, /* new value */ value));
            field = value;
            OnPropertyChanged(
                new PropertyChangedEventArgs(/* current value */ oldValue, /* new value */value));
        }
    } = default(T);
    
    내가 보기에 이것은 가장 유망한 특성 중의 하나이며 모든 C#10 개발자들이 가장 기대하는 특성 중의 하나이다.그것이 언제 정식으로 발표될지 아직 알 수 없지만, 우리는 주의를 기울일 것이다.

    목록 모드


    Microsoft가 C#10에 게시하지 않은 이유에 대해 살펴보겠습니다.

    "We have a syntactic design and semantic design for arrays and indexable types, but we will need to some more work for IEnumerable support. We hope to have an initial preview soon into the C# 11 development cycle to help get user feedback on the design choices we've made so far."


    ¯\( ͡° ͜ʖ ͡°)/¯
    목록 모드는 가 권장하는 기능으로 다음과 같이 자세히 설명되어 있습니다.

    "Lets you to match an array or a list with a sequence of patterns e.g. array is {1, 2, 3} will match an integer array of the length three with 1, 2, 3 as its elements, respectively."


    이 점을 더 잘 이해하기 위해 그가 사용한 부분의 예를 살펴보자.
    positional_pattern
      : type? positional_pattern_clause length_pattern_clause? property_or_list_pattern_clause? simple_designation?
      ;
    
    property_or_list_pattern_clause
      : list_pattern_clause
      | property_pattern_clause
      ;
    
    property_pattern_clause
      : '{' (subpattern (',' subpattern)* ','?)? '}'
      ;
    
    list_pattern_clause
      : '{' pattern (',' pattern)* ','? '}'
      ;
    
    전체 예제 및 자세한 내용은 Alrz에서 확인할 수 있습니다.

    모델 권장 사항을 GitHub에 나열합니다. 인터페이스의 정적 요약


    (본 제안의 공헌자)가 인터페이스에 추상적인 정적 구성원을 지정하는 규정에 따라 인터페이스의 유형과 구조를 실현하는 데는 이 구성원들을 현식 또는 은식으로 토론한 인터페이스의 실현에 포함시킬 의무가 있다.인터페이스 제한이 금지되지 않는 형식 파라미터를 지정해서 구성원에게 접근할 수 있습니다.
    정적 구성원을 추상화할 수 없고, 이 정적 구성원의 유형을 지정하는 일반적인 코드를 구축할 수 없습니다. 이것은 현재 기술의 주요한 제한입니다.정적 형식으로만 존재하는 구성원 유형(예를 들어 연산자)에 대해 말하자면, 이것은 특히 처리하기 어렵다.
    인터페이스의 정적 추상은 디지털 유형의 통용 알고리즘을 실현할 수 있으며 이러한 알고리즘은 일부 연산자에 존재하는 인터페이스 제약을 지시한다.따라서 알고리즘은 다음과 같은 연산자로 나타낼 수 있다.
    // Interface specifies static properties and operators
    interface IAddable<T> where T : IAddable<T>
    {
        static abstract T Zero { get; }
        static abstract T operator +(T t1, T t2);
    }
    
    // Classes and structs (including built-ins) can implement interface
    struct Int32 : , IAddable<Int32>
    {
    // Explicit
        static Int32 I.operator +(Int32 x, Int32 y) => x + y; 
    // Implicit
        public static int Zero => 0;                          
    }
    
    // Generic algorithms can use static members on T
    public static T AddAll<T>(T[] ts) where T : IAddable<T>
    {
    // Call static operator    
        T result = T.Zero;
    // Use `+`                   
        foreach (T t in ts) { result += t; } 
        return result;
    }
    
    // Generic method can be applied to built-in and user-defined types
    int sixtyThree = AddAll(new [] { 1, 2, 4, 8, 16, 32 });
    
    전체 예제 및 자세한 내용은 MadsTorgersen 에서 확인할 수 있습니다.
    MadsTorgesen은 구조적 구속조건과 같은 몇 가지 대안을 제시했습니다.

    "An alternative approach would be to have "structural constraints" directly and explicitly requiring the presence of specific operators on a type parameter. The drawbacks of that are:"

  • 매번 반드시 써야 한다.이름 지정 구속을 사용하는 것이 더 나은 것 같습니다.
  • 이것은 새로운 제약이고 건의하는 기능은 인터페이스 제약의 기존 개념을 이용했다.
    그것은 조작원에게만 적용되며, 다른 유형의 정적 구성원에게는 적용되지 않는다.
  • GitHub 인터페이스 제안의 정적 요약 규칙이나 모드에서의 성명


    이 기능은 다음 사항에 대해 다시 권장되는 기능입니다.

    "Allow pattern variables to be declared in different mutually exclusive patterns. This is the part of pattern-matching proposal that did not make it into C# 9.0."


    만약 모든 상호 배척 모드가 서로 다른 유형의 변수를 만들었다면, 이러한 변수는 특정한 코드 경로에 튼튼하게 분배되지 않을 것이다. 이것이 바로 필요한 것이다.or 모드와 스위치 부분의 매번 출현을 포함합니다.
    예를 들어 패턴 변수는 = "" 자문에 명확하게 값을 부여할 수 있지만 스위치 세그먼트의 주체에 값을 부여할 수 없다. 이것은 다음과 같다.
    case (int x, 0) a when Use(x, a): // ok
      case (0, int x) b when Use(x, b): // ok
         Use(x); // ok
         Use(a); // error; not definitely assigned
         Use(b); // error; not definitely assigned
         break;
    
    모드 변수를 곱하여 방정식의 양면에 다음과 같이 반복적으로 정의할 수 있습니다.
    if (e is { A: (int x, 0) or (0, int x) } or
             { B: (int x, 0) or (0, int x) })
    {
        Use(x);
    }
    
    마찬가지로, 만약 당신이 GitHub에 대해 완전히 알고 싶다면, 나는 당신이 GitHub에서 깊이 있게 읽는 것을 건의합니다. Alrz

    성명 C#11 언제 나와요?


    크리스마스가 11시예요?나는 이것이 단지 실현 가능한 꿈일 뿐이라고 생각한다. (이것은 마이크로소프트가 처음으로 묵묵히 일한 것이 아니다.) 비록 C#10에서 발표한 모든 기능을 보았지만, 이것은 보기에 그리 불가능해 보인다.어쨌든 우리는 다음 며칠 안에 발견할 것이다.
    그럼 너는?친애하는 독자?C#11에 무슨 일이 일어날 것 같습니까?알려줘!나도 너의 의견을 알고 싶다.
    만약 네가 이 문장을 좋아한다면, 우리를 주목하는 것을 잊지 마라. 그러면 너는 이 문장을 처음 읽는 사람 중의 하나가 될 수 있다.그물
    만약 당신이 이 글을 읽고 있다면, 이것은 당신이 1%에 속한다는 것을 의미한다. 그들은 문장의 끝까지 읽을 것이다. 왜냐하면 크리스마스와 새해가 곧 다가오기 때문이다.... 선물로 나에게 알려주십시오.🎁 2021년이 너에게 얼마나 좋은지.
    메리 크리스마스! :) ⛄🎄

    부터 우리는 당신이 이 글을 읽는 데 시간을 들인 것에 감사를 드리고 싶습니다. 우리의 Dotnetsafer에서 당신은 더 많은 것을 배울 수 있다는 것을 잊지 마세요.
    기억해라: 지금 너는 우리의 best C# Blog를 무료로 시험해 볼 수 있다.또한 best C# obfuscator를 사용하여 Visual Studio에서 어플리케이션을 직접 보호할 수도 있습니다.그 밖에 그 전에 너는 공부할 수 있다.

    좋은 웹페이지 즐겨찾기