건어물 습격!C\#7.0 새로운 기능(VS 2017 사용 가능)

머리말
마이크로소프트 가 어제 새로운 VS 2017 을 발 표 했 습 니 다.그 에 따 른 많은 것들 이..................................................................
사실 2016 년 12 월 에 발 표 된 C\#7.0 의 새로운 특성 을 공유 해 보 세 요.일찍 나 왔 지만 이 IDE 는 지원 하지 않 습 니 다.
하지만 어제 VS 2017 에 서 는 완벽 하 게 사용 할 수 있 었 습 니 다.
E.좋 습 니 다.공식 소개 주소 로 이동 합 니 다.https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/csharp-7
먼저 관련 문법 을 열거 하 세 요.
1.out-variables(Out 변수)
2.Tuples(원조)
3.패턴 매 칭(매 칭 모드)
4.ref locals and returns(부분 변수 와 참조 반환)
5.Local 함수(부분 함수)
6.More expression-bodied members(더 많은 함수 구성원 의 표현 식 체)
7.throw 표현 식(이상 표현 식)
8.Generalized async return types(일반적인 비동기 반환 형식)
9.숫자 문자 문법 개선(수치 문자 문법 개선)
본문
1.out-variables(Out 변수)
예전 에 우리 가 out 변 수 를 사용 할 때 외부 에서 먼저 설명 한 다음 에 들 어 갈 수 있 는 방법 은 다음 과 같 습 니 다.

string ddd = ""; //     
ccc.StringOut(out ddd);
Console.WriteLine(ddd);
C\#7.0 에서 우 리 는 설명 할 필요 가 없고 매개 변수 가 전달 되 는 동시에 다음 과 같이 설명 할 수 있다.

StringOut(out string ddd); //       
Console.WriteLine(ddd);
Console.ReadLine();
2.Tuples(원조)
증 금.NET 4.0 에서 마이크로 소프트 는 여러 개의 반환 값 을 우리 에 게 원 그룹 이 라 고 하 는 해결 방안 을 주 었 다.유사 한 코드 는 다음 과 같다.

static void Main(string[] args)
 {
 var data = GetFullName();
 Console.WriteLine(data.Item1);
 Console.WriteLine(data.Item2);
 Console.WriteLine(data.Item3);
 Console.ReadLine();
}
static Tuple<string, string, string> GetFullName() 
{
 return new Tuple<string, string, string>("a", "b", "c");
}
위의 코드 는 세 개의 문자열 이 있 는 원 조 를 되 돌려 주 는 방법 을 보 여 주 었 습 니 다.그러나 우리 가 값 을 얻 었 을 때 마음 이 터 졌 습 니 다.아 이 템 1,아 이 템 2,아 이 템 3 은 어떤 귀신 입 니까?우리 의 요구 에 도 달 했 지만 정말 우아 하지 않 습 니 다.
그러면 C\#7.0 에서 마이크로소프트 는 더욱 우아 한 방안 을 제공 합 니 다.(주의:nuget 을 통 해 System.ValueTuple 을 참조 해 야 합 니 다)다음 과 같 습 니 다.

 static void Main(string[] args)
 {
 var data=GetFullName();
 Console.WriteLine(data.a); //        
 Console.WriteLine(data.b);
 Console.WriteLine(data.c);
 Console.ReadLine();

 }


 //          ,   
 private static (string a,string b,string c) GetFullName()
 {
 return ("a","b","c");
 }

원본 그룹 을 해체 합 니 다.가끔 은 var 익명 으로 가 져 오고 싶 지 않 을 때 가 있 습 니 다.abc 를 어떻게 가 져 옵 니까?우 리 는 다음 과 같이 할 수 있다.

 static void Main(string[] args)
 {
 //      
 (string a, string b, string c) = GetFullName();

 Console.WriteLine(a);
 Console.WriteLine(b);
 Console.WriteLine(c);
 Console.ReadLine();

 }


 private static (string a,string b,string c) GetFullName()
 {
 return ("a","b","c");
 }

3.패턴 매 칭(매 칭 모드)
C\#7.0 에서 일치 하 는 모드 의 게임 방법 을 도 입 했 습 니 다.먼저 밤 을 들 었 습 니 다.하나의 object 유형 입 니 다.우 리 는 그 가 int 인지 아 닌 지 를 판단 하고 싶 습 니 다.int 라면 10 을 추가 한 다음 에 출력 하려 면 다음 과 같 아야 합 니 다.

object a = 1;
if (a is int) //is  
{
 int b = (int)a; // 
 int d = b+10; // 10
 Console.WriteLine(d); //  
}
그러면 C\#7.0 에서 먼저 is 에 대한 작은 확장 입 니 다.우 리 는 이렇게 쓰 면 됩 니 다.다음 과 같 습 니 다.

object a = 1;
if (a is int c) //  ,   int       c
{
 int d = c + 10;
 Console.WriteLine(d);
}
이렇게 하면 매우 편리 하지 않 습 니까?특히 반 사 를 자주 쓰 는 동지 들 은...
그럼 문제 가 생 겼 습 니 다.굴착기 기술 은 어느 쪽 이 강 합 니까?!(크 크,퉤 농담)
사실은 여러 가지 유형 이 일치 해 야 한다 면 어떻게 해 야 합 니까?if else 여러 개?물론 괜 찮 습 니 다.하지만 마이크로소프트 아버지 도 switch 의 새로운 게임 방법 을 제공 하 셨 습 니 다.어디 보 자.다음 과 같 습 니 다.
Object 를 매개 변수 로 동적 형식 으로 되 돌려 주 는 Add 방법 을 정의 합 니 다.

 static dynamic Add(object a)
 {
 dynamic data;
 switch (a)
 {
 case int b:
  data=b++;
  break;
 case string c:
  data= c + "aaa";
  break;
 default:
  data = null;
  break;
 }
 return data;
 }
다음 실행,int 형식 으로 전송:

object a = 1;
var data= Add(a);
Console.WriteLine(data.GetType());
Console.WriteLine(data);
출력 그림:

String 형식의 인자,코드 와 출력 은 다음 과 같 습 니 다.

object a = "bbbb";
var data= Add(a);
Console.WriteLine(data.GetType());
Console.WriteLine(data);

위의 코드 를 통 해 우 리 는 switch 의 새로운 게임 방법 이 얼마나 원활 하고 강 한 지 알 수 있 습 니 다.
일치 하 는 패턴 의 Case When 필터
어떤 기 우 는 곧 물 어 볼 것 이다.우리 가 Switch 에서 유형 을 일치 시 킬 수 있 으 니,우 리 는 가 는 길에 값 을 선별 할 수 있 습 니까?답 은 당연히 긍정 적 이다.
우 리 는 위의 스위치 코드 를 다음 과 같이 고 쳤 다.

 switch (a)
 {
 case int b when b < 0:
  data = b + 100;
  break;
 case int b:
  data=b++;
  break;
 case string c:
  data= c + "aaa";
  break;
 default:
  data = null;
  break;
 }
입력-1 해 보 세 요.결 과 는 다음 과 같 습 니 다.

4.ref locals and returns(부분 변수 와 참조 반환)
이미 보충,이동:C\#7.0 의 ref locals and returns(부분 변수 와 참조 반환)
5.Local 함수(부분 함수)
음,이것 은 약간 전복 되 었 습 니 다.모두 가 알 고 있 듯 이 국부 변 수 는 특정한 과정 이나 함수 에서 만 접근 할 수 있 는 변 수 를 말 합 니 다.
그럼 이 부분 함 수 는 말 그대로 특정한 함수 에서 만 접근 할 수 있 는 함수 입 니 다.
사용 방법 은 다음 과 같다. 

 public static void DoSomeing()
 {
 //  Dosmeing2
 int data = Dosmeing2(100, 200);
 Console.WriteLine(data);
 //      ,Dosmeing2.
 int Dosmeing2(int a, int b)
 {
 return a + b;
 }
 }
어,설명 하 자 면 아마도 DoSoming 에서 DoSoming 2 의 방법 을 정 의 했 을 거 야..앞에서 호출 했 어.
(주:주의해 야 할 것 은 부분 함수 가 방법의 모든 위치 에 정의 되 어 있 고 방법 내 에서 호출 될 수 있 으 며 한 줄 씩 해석 하 는 방식 을 따 르 지 않 아 도 됩 니 다) 
6.More expression-bodied members(더 많은 함수 구성원 의 표현 식 체)
C\#6.0 에 서 는 한 문장 만 있 는 방법 체 를 표현 식 으로 간략하게 쓸 수 있 도록 제공 합 니 다.
다음 과 같다.

 public void CreateCaCheContext() => new CaCheContext();
 //        
 public void CreateCaCheContext()
 {
 new CaCheContext();
 } 
그러나 구조 함수,분석 함수,속성 접근 기 는 지원 되 지 않 습 니 다.그러면 C\#7.0 은 지원 합 니 다.코드 는 다음 과 같 습 니 다.

//           
public CaCheContext(string label) => this.Label = label;

//           
~CaCheContext() => Console.Error.WriteLine("Finalized!");

private string label;

// Get/Set           
public string Label
{
 get => label;
 set => this.label = value ?? "Default label";
}

7.throw 표현 식(이상 표현 식)
C\#7.0 이전에 우 리 는 문자열 이 null 인지 아 닌 지 를 판단 하고 싶 습 니 다.null 이면 이상 을 제거 합 니 다.우 리 는 이렇게 써 야 합 니 다.

 public string IsNull()
 {
 string a = null;
 if (a == null)
 {
 throw new Exception("   !");
 }
 return a;
 }
이렇게 하면 우 리 는 매우 불편 합 니 다.특히 3 원 표현 식 이나 비 어 있 는 표현 식 에서 이 이상 을 버 릴 수 없습니다.if 문 구 를 써 야 합 니 다.
그러면 우 리 는 C\#7.0 에서 이렇게 할 수 있다.

 public string IsNull()
 {
 string a = null;
 return a ?? throw new Exception("   !");
 }
 8.Generalized async return types(일반적인 비동기 반환 형식)
응,이 건 뭐 랄 까?사실 나 는 비동기 적 으로 사용 하 는 것 이 비교적 적기 때문에 이 느낌 에 대해 깊이 이해 하지 못 하 는 것 이 냐,아니면 연 합 란 이 라 고 생각 하 는 것 이 냐?특정한 상황 에서 유용 할 것 이다.
나 는 공식 원문 을 직접 번역 했다.인 스 턴 스 코드 도 공식 원문 이다.
비동기 방법 은 void,Task 또는 Task로 돌아 가 야 합 니 다.이번 에는 새로운 ValueTask를 추가 하여 비동기 실행 결 과 를 기다 릴 때 사용 할 수 있 는 상황 에서 Task를 분배 하 는 것 을 방지 합 니 다.많은 예시 에서 버퍼 링 을 설계 하 는 비동기 장면 은 분배 의 수량 을 크게 줄 이 고 성능 을 현저하게 향상 시 킬 수 있다.
공식 인 스 턴 스 는 하나의 데이터 가 캐 시 된 상태 에서 ValueTask 를 사용 하여 비동기 또는 동기 화 2 가지 방안 을 되 돌려 줄 수 있다 는 뜻 이다.

 public class CaCheContext
 {
 public ValueTask<int> CachedFunc()
 {
 return (cache) ? new ValueTask<int>(cacheResult) : new ValueTask<int>(loadCache());
 }
 private bool cache = false;
 private int cacheResult;
 private async Task<int> loadCache()
 {
 // simulate async work:
 await Task.Delay(5000);
 cache = true;
 cacheResult = 100;
 return cacheResult;
 }
 }
호출 된 코드 와 결 과 는 다음 과 같 습 니 다.

 //main      async  ,      .
 static void Main(string[] args)
 {
 Action act = async () =>
 {
 CaCheContext cc = new CaCheContext();
 int data = await cc.CachedFunc();
 Console.WriteLine(data);
 int data2 = await cc.CachedFunc();
 Console.WriteLine(data2);
 };
 //      
 act();
 Console.Read();

 }
위의 코드 는 두 번 연속 호출 되 었 습 니 다.첫 번 째 는 5 초 동안 결과 가 나 오 기 를 기 다 렸 습 니 다.두 번 째 는 결과 가 예상 한 효과 와 일치 하 기 를 기다 리 지 않 았 습 니 다.
 9.숫자 문자 문법 개선(수치 문자 문법 개선)
이 건 순 전 히..보기 위해 서..
C\#7.0 에서 숫자 에''이 나타 날 수 있 도록 합 니 다.이 분할 기 호 는 가 독성 을 높 인 다.예 를 들 어 다음 과 같다.

 int a = 123_456;
 int b = 0xAB_CD_EF;
 int c = 123456;
 int d = 0xABCDEF;
 Console.WriteLine(a==c);
 Console.WriteLine(b==d);
 //         true,     "_"         ,         
물론 숫자 형식의 구분자 라면 decimal,float,double  다 이렇게 갈 라 질 수 있어.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기