Parameters의 포지션이 아닌 Parameters의 이름을 명시해 arguments를 넘길 수 있게 해줍니다.
Generic covariant and contravariant
Embedded interop types
C#5
New keyword async await
비동기 작업이 가능한 asyncawait 키워드가 생겼습니다.
유니티에서 비동기 프로그래밍을 시작하기 위한 참고사항
비동기 함수는 Task 나 Task<TResult>의 리턴값을 가져야 합니다.
task를 리턴하는 비동기 함수는 언제나 async 키워드를 붙여야 합니다.
동기식 코드에서 비동기 함수를 실행 할 때만 async void 형이여야 합니다.
유니티는 UnitySynchronizationContext 를 사용하여 기본적으로 메인 스레드에서 비동기 함수를 실행합니다.
unity API 는 메인 스레드 외부에서 접근 불가능합니다.
현재 Unity WebGL 에서는 스레드를 사용하는 작업을 지원 하지 않습니다.
코루틴과 async-await 중요 차이점
코루틴은 값을 리턴 할 수 없지만, Task<TResult> 는 가능합니다.
try-catch 문에 yield 를 넣을 수 없어서 코루틴에서 에러 찾기는 어렵습니다. 하지만 async-await 에서는 try-catch 문이 가능합니다.
코루틴은 MonoBehaviour 에서 파생되지 않는 클래스에서는 사용 불가능합니다.
async-await 가 유니티 coroutine을 완전히 대체하라고 권하지 않습니다. 프로파일링을 통해 결과를 확인하고 접근하세요.
Caller info attributes
리플렉션 코드 없이 많은 컨텍스트 정보를 쉽게 가져 오게끔 해줍니다.
C#6
Read-only auto-properties
읽기 전용 property는 간단히 get 만 선언함으로써 만들 수 있습니다.
생성자가 아닌 곳에서 접근 시 에러를 생성합니다.
Auto-property initializers
자동 property 생성자는 property 선언시 값을 초기화 할 수 있게 해줍니다.
Index initializers
String interpolation
Expression-bodied function members
using static
한 클래스의 스태틱 메소드를 가져오는 것이 향상되었습니다.
Null-conditional operators
널 상태 오퍼레이터는 Null 체크를 쉽고 부드럽게 만들어줍니다. 단순히 멤버 접근을 .에서 ?. 로 바꾸세요.
person 객체가 null 이면 first 변수에 null 이 할당됩니다. person 객체가 null 이 아니라면 FirstName 이 할당됩니다.
person 변수가 null 일 경우에 NullRefferenceException 을 생성하지 않고 null 을 반환합니다. 또 배열 혹은 인덱스에 접근할때 [] 를 ?[]로 바꾸는걸로 사용가능합니다.
?? 오퍼레이터와 함꼐 해서 Default 값을 셋팅 할 수도 있습니다.
앞의 오퍼레이터가 널을 리턴한다면 뒤의 나머지 체인들을 실행되지 않습니다. 위 예제에서는 만약 A나 B가 널이라면 C를 실행 하지 않습니다.
Extension Add methods in collection initializers
콜렉션 이니셜라이저에 Add 메소드 익스텐션이 적용됩니다.
C#7.0
out variables
이제 out 변수를 따로 선언하는게 아닌 메소드가 불리는 곳에서 arguments로 선언할 수 있습니다.
Tuples
이제 가볍고 여러 공개 필드를 가지는 명시되지 않는 타입을 만들 수 있습니다. 컴파일러나 IDE는 이러한 타입의 시맨틱을 이해합니다.
튜플은 C#7.0 이전에도 사용 가능했으나, 효과적이지 않고 언어적 도움도 없었습니다.
Discards
Discard는 _ 키워드로 사용하는 쓰기 전용 변수입니다. 단순히 버리기를 의도하는 하나의 변수나 모든 변수에 할당 할 수 있습니다.
Discard는 할당되지 않은 변수와 같습니다.
Discard는 다음의 경우에 도움을 줍니다.
튜플이나 유저정의 형식을 해체할때.
out arguments 없이 함수가 호출될때.
is나 switch 구문이 사용되는 패턴 매칭 연산때.
명백히 버리기 위해 할당한 단독 형식일 경우에.
Pattern Matching
패턴 매칭은 객체 뿐만 아니라 property에 대해 메서드 디스패치를 구현 할 수 있게 해주는 기능입니다.
패턴 매칭은 switch와 is 구문을 지원합니다. 패턴에 대해 추가적인 특별한 룰을 지정하기 위해 when 키워드를 씁니다.
2가지 사용 방법을 소개하겠습니다.
is 패턴 표현식은 익숙한 is 연산자를 사용하여 해당 타입에 대한 객체를 질의하고 결과를 할당하는것을 하나의 명령어로 처리합니다.
기존 스위치 문에 몇가지가 추가되었습니다.
모든 타입이 다 사용가능합니다.
각각의 라벨에서 스위치 표현식을 체크 할 수 있습니다. is 표현식과 마찬가지로 새 변수를 할당 할 수 있습니다.
해당 변수에 대한 추가 체크 조건을 위해 when 절을 추가 할 수 있습니다.
case 라벨 순서는 이제 중요합니다. 첫번째 일치하는 매칭 구문이 실행되고 나머진 지나갑니다.
ref locals and returns
밸류 타입에 대한 Refference를 다룰 수 있습니다.
C#언어에서는 ref local과 return을 잘못 사용하는것을 막아 줄 몇 가지 규칙들이 있습니다.
상수의 시작부분에 있는 0b는 바이너리 넘버로 쓰여졌음을 나타냅니다. 바이너리 넘버는 더 길어질 수 있기때문에 digit seperator _를 통해 비트 패턴을 더 쉽게 확인 할수 있습니다. digit seperator는 상수 어디에나 나타날 수 있습니다. 기본적인 10진수의 경우 일반적으로 천 단위 구분자로 사용됩니다.
digit seperator 는 decimal, float, 그리고 double 타입에서도 사용 할 수 있습니다.
숫자 상수를 더욱 가독성 좋게 선언 할 수 있습니다.
C#7.1
async Main method
default literal expressions
대상의 타입이 유추 가능한 경우 default 값 식에서 리터럴 식을 사용 할 수 있습니다.
Inferred tuple element names
튜플 엘레멘츠의 이름은 대부분 초기화 할때 유추 가능합니다.
Pattern matching on generic type parameters
C#7.2
Techniques for writing safe efficient code
in Parameters에서 레퍼런스로 전달되지만 불린 함수에서 수정되지 않게 해줍니다.
ref readonly 한정자는 레퍼런스 값을 반환하지만 해당 오브젝트에 값을 쓰는걸 허용하지 않는걸 나타냅니다. ref readonly 한정자를 추가하는것은 호환 가능한 변경이나, 이미 존재하는 ref 반환에 readonly를 추가하는 것은 호환 가능하지 않는 변경입니다. 호출자가 ref 지역 변수를 readonly 한정자가 포함되도록 선언을 변경해야 합니다.
readyonly struct 선언은 구조체가 이뮤터블하고 멤버 변수로 in Parameters로서 넘겨져야 합니다. 기존의 구조체 선언에 readonly 한정자를 추가하는것은 이진 호환 가능 변경 입니다.
ref struct 선언은 구조체 타입이 직접 매니지드 메모리에 접근 할 수 있고 언제나 스택에 할당 됨을 나타냅니다. 기존의 stuct 선언에 ref 한정자를 추가하는 것은 호환 가능하지 않는 변경입니다. ref struct는 구조체의 멤버가 될 수 없거나 힙에 할당되지 않는 다른 영역에서 사용이 불가능합니다.
Non-trailing named arguments
명명된 아규먼트가 올바른 위치에 있을 시 위치 아규먼트 앞에 명명된 아규먼트를 사용 할 수 있습니다.
Leading underscores in numeric literals
digit이 나오기전에 _ digit seperator 를 사용 할 수 있습니다.
private protected access modifier
private protected 한정자는 같은 어셈블리 내에 선언된 상속된 클래스들에서 접근 가능합니다. 구조체는 상속 받을 수 없기 떄문에 선언 할 수 없습니다.