C# 6.0에서 바뀐 문법들을 요약해 정리해보았다. 내용을 보면 알겠지만, 제네릭과 람다식 등 그동안의 C# 버전의 변경(1.0~5.0) 때와는 달리 C# 6.0은 이전 버전과 비교해 기능적으로 그다지 크게 변화하지는 않았다.
- nameof 키워드 추가
ex) nameof(Program.Method); //"Method"가 반환됨
식별자면 모두 다 허용. 개발 중 멤버의 이름이 바뀌었을 때 용이.
- 문자열 보간 : string.Format 메소드의 축약표현($)
ex) Console.WriteLine($"Name = {name}, hours = {hours:hh}");
ex) string text = $"{person.Name, 20} is {person.Age:D3} year {(p.Age == 1 ? "" : "s")} old.";
중괄호의 출력은 중괄호를 두 번 쓰면 됨.
- null 조건부 멤버 및 인덱싱(?)
ex) int? length = array?.Length;
ex) int? count = list?[0].Count();
ex) PropertyChanged?.Invoke(e); //스레드로부터의 안전한 대리자 호출, 이 전에는 대리자를 복사했었음
ex) for(int? i=0; i<list?.Count(); i++);
ex) int count = list?.count ?? 0;
- 인덱스 이니셜라이저
ex) var numbers = new Dictionary<int, string>
{
[7] = "seven",
[9] = "nine",
[13] = "thirteen"
};
이전에 했었던 new Dictionary<int, string>{ {0, "zero"} , {9, "nine"} } 는 Add 메소드를 사용했었지만, 인덱스 이니셜라이저는 인덱스로 접근하므로 중복되는 키의 예외가 나지 않음.
- 이제는 Add 메소드를 지닌 확장메소드가 있다면 컬렉션 이니설라이저가 가능함
- 예외 필터
ex) catch (ArgumentException e) if (e.ParamName == “…”) {}
예외는 캐치되었지만 if에서 막힌다면 스택이 보존되면서 예외가 다시 던져짐.
if에서 메소드를 이용하여 예외를 굳이 다시 던지지 않고도 로그를 남길 수도 있음.
- catch 및 finally 구문에서 await 문 허용
- 자동 속성 이니셜라이저
ex) string Name {get; set;} = "Jane";
기존에는 속성의 초깃값을 설정하려면 생성자 등을 이용해야했음. 이것은 세터를 강제해야 함을 의미했으며 그것이 싫다면 자동 속성을 포기했어야 했음.
이제는 자동 속성 이니셜라이저를 통해 게터만 있어도 초깃값을 설정 가능함. 또한 게터만 있어도 컴파일시 readonly를 붙여주어 생성자에서도 할당이 가능.
- 정적형식 및 멤버에 using 지시문 허용
ex) using static System.Console;
enum과 const도 내부적으로는 static로 다뤄지므로 using static 지시문 허용. 다만 확장메소드로의 멤버는 불가능.
- 람다식 본문을 사용하는 클래스의 멤버
ex) public void Print() => Console.Write("Hello World!"); //메소드
ex) pulbic string Name => FristName + " " + LastName; //속성
ex) public Customer this[long id] => store.LookupCustomer(id); //인덱서
ex) public static Complex operator +(Complex c, Complex c2) => new Complex(c.real + c2.real, c.imaginary + c2.imaginary); //연산자
람다식으로 속성을 정의 시 게터만 설정됨. 동일한 개념으로 인덱서의 람다식 또한 읽기전용으로만 동작함.
생성자도 메소드이기는 하지만 람다식을 허용하지 않음.