C \ # 6 / 7 새로운 기능

18273 단어
C \ # 새로운 기능
1. C \ # 역사 변천
C# 1,Visual Studio .NET 2002:
  • C \ # 초판.

  • C# 1.1,Visual Studio .NET 2003:
  • / \ # line 잡 주 와 xml 문서 주석.

  • C# 2,Visual Studio .NET 2005:
  • 익명 방법, 범 형, 비어 있 는 유형, 교체 기 / yield, static 류, 의뢰 의 협 변 과 역 변.

  • C# 3,Visual Studio .NET 2008:
  • 대상 과 집합 초기 값 설정 항목, lambda 표현 식, 확장 방법, 익명 유형, 자동 속성, 로 컬 var 유형 추리 와 언어 통합 조회 (LINQ).

  • C# 4,Visual Studio .NET 2010:
  • Dynamic, 명명 실 삼 과 선택 실 삼, 범 형 협 변 과 역 변.

  • C# 5,Visual Studio .NET 2012:
  • Async / await 와 호출 자 정보 특성
  • 2. C \ # 6 의 새로운 기능 (Visual Studio. NET 2015)
    1. 확장 자동 속성 문법
    자동 속성 초기 화 표현 식.
        public class Example
        {
            // 6.0     :        
            public string FirstName { get; set; } = "Monkey";
        
            // 6.0     
            private string _firstName = "Monkey";
            public string FirstName
            {
                get { return _firstName; }
                set { _firstName = value; }
            }
        }
    

    자동 속성 만 읽 기 (읽 기 전용 자동 프로 퍼티)
    구조 함수 나 속성 초기 화 표현 식 에서 만 속성 을 설정 할 수 있 습 니 다.
    public class Example
    {
        public string FirstName { get; } = "Monkey";
    
        public string LastName { get; } 
    
        public Example(string lastName)
        {
            LastName = lastName;
        }
    }
    

    2. 표현 식 주체 (Expression - bodied function members)
    표현 식 주체 정 의 를 통 해 매우 간결 한 읽 기 가능 한 형식 으로 구성원 의 실현 문법 을 제공 할 수 있 습 니 다.
    member => expression;
    

    C \ # 6 지원: 속성 Get, 방법
        //          
        private static string SayHello() => "Hello World";
        //  Get        
        public string FullName => $"{FirstName} {LastName}";
    
    

    3. 정적 클래스 가 져 오기 (static 사용)
    형식 이름 을 제한 하지 않 고 접근 할 수 있 는 정적 구성원 을 허용 합 니 다: r
    using staticSystem.String
    
    if (IsNullOrWhiteSpace(lastName))
        throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
    
    

    메모: 확장 방법 은 이 방식 을 사용 할 수 없습니다.
    using static System.Linq.Enumerable;
    public bool MakesDeansList()
    {
        return Grades.All(g => g > 3.5) && Grades.Any();
        // Code below generates CS0103: 
        // The name 'All' does not exist in the current context.
        //return All(Grades, g => g > 3.5) && Grades.Any();
    }
    

    4. Null 조건 연산 자
    구성원 접근 (?.): value = = null 이면 null 로 돌아 갑 니 다.
    public static string Truncate(string value, int length)
    {
        /
        return value?.Substring(0, Math.Min(value.Length, length));
    
        // C# 6.0      
        //string result = value;
        //if (value != null)
        //{
        //    result = value.Substring(0, Math.Min(value.Length, length));
        //}
        //return result;
    }
    

    색인 (? [) 동작:
    List examples = null;
    Example example = examples?[0]; 
    //       Example? item = (examples != null) ? examples[0] : null
    
    Console.WriteLine(example == null); //    True
    

    5. 문자열 삽입 값 (문자열 보 간)
    public string GetFormattedGradePoint() =>
        $"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average()}";
    
    public string GetGradePointPercentage() =>
        $"Name: {LastName}, {FirstName}. G.P.A: {Grades.Average():F2}";
    
    public string GetGradePointPercentages() =>
        $"Name: {LastName}, {FirstName}. G.P.A: {Grades.Any() ? Grades.Average() : double.NaN:F2}";
    
    public string GetGradePointPercentages() =>
        $"Name: {LastName}, {FirstName}. G.P.A: {(Grades.Any() ? Grades.Average() : double.NaN):F2}";
    
    public string GetAllGrades() =>
        $@"All Grades: {Grades.OrderByDescending(g => g)
        .Select(s => s.ToString("F2")).Aggregate((partial, element) => $"{partial}, {element}")}";
    
    

    6. 이상 필터 (필터 제외)
    catch (ArgumentNullException e) when (e.ParamName == “…”)  
    {  
    }
    

    괄호 표현 식 (when) 의 결과 가 true 일 때 만 catch 블록 에 해당 하 는 문 구 를 실행 합 니 다. 그렇지 않 으 면 계속 검색 처리 프로그램 을 실행 합 니 다.
    사용 필드: http 처리
    public static async Task MakeRequestWithNotModifiedSupport()
    { 
        var client = new System.Net.Http.HttpClient();
        var streamTask = client.GetStringAsync("https://localHost:10000");
        try {
            var responseText = await streamTask;
            return responseText;
        } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
        {
            return "Site Moved";
        } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("304"))
        {
            return "Use the Cache";
        }
    }
    

    7. nameof 표현 식
    필드 사용: 잘못된 매개 변수 이름 가 져 오기
    if (IsNullOrWhiteSpace(lastName))
        throw new ArgumentException(message: "Cannot be blank", paramName: nameof(lastName));
    

    사용 장면: INotifyProperty Changed 인터페이스 감청 속성 변 화 를 사용 합 니 다.
    public string LastName
    {
        get { return lastName; }
        set
        {
            if (value != lastName)
            {
                lastName = value;
                PropertyChanged?.Invoke(this, 
                    new PropertyChangedEventArgs(nameof(LastName)));
            }
        }
    }
    private string lastName;
    
    

    메모: Nameof 는 Member 의 문자열 만 되 돌려 줍 니 다. 앞 에 대상 이나 네 임 스페이스 가 있 으 면 Nameof 는 되 돌려 줍 니 다. 마지막 부분, 그리고 Nameof 는 지원 되 지 않 는 경우 가 많 습 니 다. 예 를 들 어 방법, 키워드, 대상 의 인 스 턴 스 와 문자열, 표현 식 등 입 니 다.
    8. catch 와 finally 블록 에 키워드 await 사용 하기
    public static async Task MakeRequestAndLogFailures()
    { 
        await logMethodEntrance();
        var client = new System.Net.Http.HttpClient();
        var streamTask = client.GetStringAsync("https://localHost:10000");
        try {
            var responseText = await streamTask;
            return responseText;
        } catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
        {
            await logError("Recovered from redirect", e);
            return "Site Moved";
        }
        finally
        {
            await logMethodExit();
            client.Dispose();
        }
    }
    

    9. 색인 초기 화기 (Index Initializers)
    private List messages = new List 
    {
        "Page not Found",
        "Page moved, but left a forwarding address.",
        "The web server can't come out to play today."
    };
    
    private Dictionary webErrors = new Dictionary
    {
        [404] = "Page not Found",
        [302] = "Page moved, but left a forwarding address.",
        [500] = "The web server can't come out to play today."
    };
    

    3. C \ # 7 의 새로운 기능 (Visual Studio. NET 2017)
    1. out 변수
    / / 이전 버 전
    int numericResult;
    if (int.TryParse(input, out numericResult))
        WriteLine(numericResult);
    else
        WriteLine("Could not parse input");
    

    C \ # 7 매개 변수 목록 에서 변 수 를 설명 합 니 다.
    
    if (int.TryParse(input, out int result))
        WriteLine(result);
    else
        WriteLine("Could not parse input");
    

    2. 원조 (Tuples)
    인용 패키지 필요: System. ValueTuple
    원 그룹 은 경량급 데이터 구조 로 여러 필드 를 포함 하여 데이터 구성원 을 표시 합 니 다.
    var unnamed = ("one", "two");//      Item1、Item2、Item3......
    
    var named = (first: "one", second: "two");
    
    (string Alpha, string Beta) namedLetters = ("a", "b");
    
    var alphabetStart = (Alpha: "a", Beta: "b");
    

    원본 그룹 은 페이지 결과 가 집 중 된 데이터 와 총 줄 수 와 같은 private 와 internal 방법의 반환 형식 으로 가장 적합 합 니 다.
    private static (int Max, int Min) Range(IEnumerable numbers)
    {
        int min = int.MaxValue;
        int max = int.MinValue;
        foreach(var n in numbers)
        {
            min = (n < min) ? n : min;
            max = (n > max) ? n : max;
        }
        return (max, min);
    }
    

    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/tuples
    3. 버 림 (버 림)
    C \ # 7 부터 C \ # 포 기 를 지원 합 니 다. 프로그램 코드 에서 인위적으로 사용 을 취소 하 는 임시 가상 변수 입 니 다. 할당 되 지 않 은 변 수 를 포기 합 니 다. 값 이 없습니다. 변 수 를 포기 하고 저장 공간 을 할당 하지 않 기 때문에 버 리 면 메모리 분 배 를 줄 일 수 있 습 니 다.
    장면 1: 원조 와 대상 분석 1
    var (_, _, area) = city.GetCityInformation(cityName);
    
    public class Example
    {
       public static void Main()
       {
           Person p = new Person("John", "Quincy", "Adams", "Boston", "MA");
    
           // 
           // Deconstruct the person object.
           var (fName, _, city, _) = p;
           Console.WriteLine($"Hello {fName} of {city}!");
           // The example displays the following output:
           //      Hello John of Boston!       
           // 
       }
    }
    

    필드 2: out 매개 변수 사용
    if (DateTime.TryParse(dateString, out _)) 
                Console.WriteLine($"'{dateString}': valid");
    

    장면 3: 독립 버 림
    using System;
    using System.Threading.Tasks;
    
    public class Example
    {
       public static void Main()
       {
          ExecuteAsyncMethods().Wait();
       }
    
       private static async Task ExecuteAsyncMethods()
       {    
          Console.WriteLine("About to launch a task...");
          _ = Task.Run(() => { var iterations = 0;  
                               for (int ctr = 0; ctr < int.MaxValue; ctr++)
                                  iterations++;
                               Console.WriteLine("Completed looping operation...");
                               throw new InvalidOperationException();
                             });
          await Task.Delay(5000);                        
          Console.WriteLine("Exiting after 5 second delay");
       }
    }
    // The example displays output like the following:
    //       About to launch a task...
    //       Completed looping operation...
    //       Exiting after 5 second delay
    

    장면 4: switch 와 is 모드 를 사용 하여 일치 합 니 다.
    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/discards
    4. 패턴 일치 (패턴 일치)
    is 형식 모드 표현 식: 기 존 문법 최적화
    public static double ComputeAreaModernIs(object shape)
    {
        if (shape is Square s)
            return s.Side * s.Side;
        else if (shape is Circle c)
            return c.Radius * c.Radius * Math.PI;
        else if (shape is Rectangle r)
            return r.Height * r.Length;
        // elided
        throw new ArgumentException(
            message: "shape is not a recognized shape",
            paramName: nameof(shape));
    }
    

    if (! (shape is Square s) 를 작성 하여 논 리 를 반전 시 킵 니 다. 변 수 는 false 분기 에서 만 명확 하 게 할당 합 니 다.
    사용 모드 매 칭 switch 문장
    public static double ComputeAreaModernSwitch(object shape)
    {
        switch (shape)
        {
            case Square s:
                return s.Side * s.Side;
            case Circle c:
                return c.Radius * c.Radius * Math.PI;
            case Rectangle r:
                return r.Height * r.Length;
            default:
                throw new ArgumentException(
                    message: "shape is not a recognized shape",
                    paramName: nameof(shape));
        }
    }
    

    case 표현 식 의 when 문장
    public static double ComputeArea_Version5(object shape)
    {
        switch (shape)
        {
            case Square s when s.Side == 0:
            case Circle c when c.Radius == 0:
            case Triangle t when t.Base == 0 || t.Height == 0:
            case Rectangle r when r.Length == 0 || r.Height == 0:
                return 0;
    
            case Square s:
                return s.Side * s.Side;
            case Circle c:
                return c.Radius * c.Radius * Math.PI;
            case Triangle t:
                return t.Base * t.Height * 2;
            case Rectangle r:
                return r.Length * r.Height;
    //  
            case null:
                throw new ArgumentNullException(paramName: nameof(shape), message: "Shape must not be null");
            default:
                throw new ArgumentException(
                    message: "shape is not a recognized shape",
                    paramName: nameof(shape));
        }
    }
    

    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/pattern-matching
    5. ref 반환 값 과 부분 변수 (ref locals and returns)
    반환 값 허용 방법 을 참조 하여 대상 의 인용 (값 이 아 닌) 을 호출 자 에 게 되 돌려 줍 니 다. 그리고 호출 자 는 되 돌아 오 는 대상 을 값 에 따라 되 돌려 주거 나 인용 에 따라 되 돌려 줍 니 다. 인용 에 따라 되 돌아 오 는 값 을 호출 자가 인용 (값 이 아 닌) 으로 처리 하면 이 값 은 ref 부분 변수 입 니 다.
    예시
    FindNumber 방법 은 인용 에 따라 매개 변수 로 전달 되 는 첫 번 째 숫자 보다 크 거나 같은 숫자 를 되 돌려 줍 니 다. 이 매개 변수 보다 크 거나 같은 숫자 가 없 으 면 색인 0 의 숫자 를 되 돌려 줍 니 다.
    using System;
    
    class NumberStore
    {
       int[] numbers = { 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023 };
    
       public ref int FindNumber(int target)
       {
          for (int ctr = 0; ctr < numbers.Length; ctr++) {
             if (target == numbers[ctr]) {
                return ref numbers[ctr];
             }   
             else if (ctr == numbers.Length - 1) {
                return ref numbers[ctr];
             }      
             else if (target < numbers[ctr]) {
                if (ctr > 0 && target > numbers[ctr - 1])
                   return ref numbers[ctr];
                else if (ctr == 0)
                   return ref numbers[0];      
             }
          }
          return ref numbers[0];
       }
    
       public override string ToString()
       {
          string retval = "";
          for (int ctr = 0; ctr < numbers.Length; ctr++) {
             retval += $"{numbers[ctr]} ";   
          }
          return retval.Trim();   
       }
    }
    
    

    예제 에서 보 듯 이 이 변경 사항 은 NumberStore 인 스 턴 스 의 배열 요소 값 에 반 영 됩 니 다.
    using System;
    
    public class Example
    {   
       static void Main(string[] args)
       {
          var store = new NumberStore();
          Console.WriteLine($"Original sequence: {store.ToString()}");
          int number = 16;
          ref var value = ref store.FindNumber(number);
          value*=2;
          Console.WriteLine($"New sequence:      {store.ToString()}");
       }
    }
    // The example displays the following output:
    //       Original sequence: 1 3 7 15 31 63 127 255 511 1023
    //       New sequence:      1 3 7 15 62 63 127 255 511 1023
    

    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/ref-returns
    6.Local Functions
    C \ # 7 부터 C \ # 로 컬 함 수 를 지원 합 니 다. 로 컬 함 수 는 다른 구성원 에 포 함 된 형식의 개인 적 인 방법 입 니 다. 포 함 된 구성원 에서 만 호출 할 수 있 습 니 다. 다음 위치 에서 로 컬 함 수 를 설명 하고 호출 할 수 있 습 니 다.
  • 방법 (특히 교체 기 방법 과 비동기 방법)
  • 구조 함수
  • 속성 접근 기
  • 이벤트 접근 기
  • 익명 방법
  • Lambda 표현 식
  • 종결 기
  • 기타 로 컬 함수
  • using System;
    using System.IO;
    
    class Example
    {
        static void Main()
        {
            string contents = GetText(@"C:\temp", "example.txt");
            Console.WriteLine("Contents of the file:
    " + contents); } private static string GetText(string path, string filename) { var sr = File.OpenText(AppendPathSeparator(path) + filename); var text = sr.ReadToEnd(); return text; // Declare a local function. string AppendPathSeparator(string filepath) { if (! filepath.EndsWith(@"\")) filepath += @"\"; return filepath; } } }

    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/local-functions
    7. 더 많은 표현 식 주체 구성원 (More expression - bodied members)
    C \ # 7 지원: 구조 함수, 종결 기, 속성 집합 문, 색인 기
    구조 함수
    public class Location
    {
       private string locationName;
       
       public Location(string name) => locationName = name;
    }
    

    종결 기
    using System;
    
    public class Destroyer
    {
       public override string ToString() => GetType().Name;
       
       ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");
    }
    

    속성 세트 문장,
    public class Location
    {
       public string Name
       {
          get => locationName;
          set => locationName = value;
       } 
    }
    

    색인 기
    using System;
    using System.Collections.Generic;
    
    public class Sports
    {
       private string[] types = { "Baseball", "Basketball", "Football", 
                                  "Hockey", "Soccer", "Tennis", 
                                  "Volleyball" }; 
    
       public string this[int i]
       {
          get => types[i];
          set => types[i] = value;
       }
    }
    

    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/expressions#expression-body-definitions
    8. throw 표현 식 (throw 표현 식)
    C \ # 7 부터 throw 는 표현 식 과 문장 으로 사용 할 수 있 습 니 다. 이전에 지원 하지 않 았 던 상하 문 에서 이상 을 일 으 킬 수 있 습 니 다.
    조건 부 연산 자
    private static void DisplayFirstNumber(string[] args)
    {
       string arg = args.Length >= 1 ? args[0] : 
                                  throw new ArgumentException("You must supply an argument");
       if (Int64.TryParse(arg, out var number))
          Console.WriteLine($"You entered {number:F0}");
       else
          Console.WriteLine($"{arg} is not a number.");                            
      
    }
    

    null 병합 연산 자
    public string Name
    {
        get => name;
        set => name = value ?? 
            throw new ArgumentNullException("Name cannot be null", nameof(value));
    }
    

    expression - bodied lambda 또는 방법.
    DateTime ToDateTime(IFormatProvider provider) => 
             throw new InvalidCastException("Conversion to a DateTime is not supported.");
    

    참고:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/throw#the-throw-expression
    9.Generalized async return types
    10. 디지털 문법 개선 (숫자 문자 문법 개선)
    2 진법
    public const int One =  0b0001;
    public const int Two =  0b0010;
    public const int Four = 0b0100;
    public const int Eight = 0b1000;
    

    숫자 구분자
    public const long BillionsAndBillions = 100_000_000_000;
    public const double AvogadroConstant = 6.022_140_857_747_474e23;
    public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;
    

    레 퍼 런 스
    https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/

    좋은 웹페이지 즐겨찾기