C# 6.0์ ์๋ก์ด ๊ธฐ๋ฅ
- ํํ์ ๋ ๋ฒจ
- ๋ ์กฐ๊ฑด ์ฐ์ฐ์(Null-conditional operator)
- ๋ฌธ์์ด ๋ณด๊ฐ(String Interpolation)
- Dictionary Initializer
- nameof ์ฐ์ฐ์
- ๋ฌธ์ฅ ๋ ๋ฒจ
- using static ๋ฌธ
- catch/finally ๋ธ๋ก์์ await ์ฌ์ฉ
- Exception Filter ์ง์
- ํด๋์ค ๋ฉค๋ฒ ๋ ๋ฒจ
- ์๋ ์์ฑ ์ด๊ธฐ์(Auto Property Initializer)
- ์ฝ๊ธฐ ์ ์ฉ ์๋ ์์ฑ(Getter only)
- Expression-bodied member ์ฌ์ฉ
https://www.csharpstudy.com/CS6/CSharp-6-new-features.aspx
1. ํํ์ ๋ ๋ฒจ
1) Null ์กฐ๊ฑด ์ฐ์ฐ์(Null conditional operator)
๊ฐ์ฒด์ ๋ฉ์๋๋ ์์ฑ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฐ์ฒด๊ฐ Null์ธ์ง ํญ์ ์ฒดํฌํด ์ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋ฌํ ๋ถํธ์ ๋์ด ์ฃผ๊ธฐ ์ํด ? ์ฐ์ฐ์๋ฅผ ํตํด ? ์ฐ์ฐ์ ์์ ์๋ ๊ฐ์ฒด๊ฐ Null์ธ์ง ์ฒดํฌํด์ Null์ด๋ฉด ๊ทธ๋ฅ Null์ ๋ฆฌํดํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์์ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์คํํ๋ค.
// rows๊ฐ NULL์ด๋ฉด, cnt ๋ NULL
// rows๊ฐ NULL์ด ์๋๋ฉด, cnt๋ ์ค์ rows ๊ฐฏ์
int? cnt = rows?.Count;
// customers ์ปฌ๋ ์
์ด NULL์ด๋ฉด, c๋ NULL
// customers ์ปฌ๋ ์
์ด NULL์ด ์๋๋ฉด, c๋ ์ฒซ๋ฒ์งธ ๋ฐฐ์ด์์
Customer c = customers?[0];
// customers๊ฐ ๋์ธ์ง ์ฒดํฌํ๊ณ ๋ค์ customers[0]๊ฐ ๋์ธ์ง ์ฒดํฌ
int? age = customers?[0]?.Age;
? ์ฐ์ฐ์์ ๋ฆฌํด ๋ณ์๋ ํญ์ null์ ๊ฐ์ง ์ ์๋ Nullabel Type์ด์ด์ผ ํ๋ค. ๋ง์ฝ ๋ฆฌํด ๋ณ์๊ฐ Null์ ๊ฐ์ง ์ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ?? ์ฐ์ฐ์(Null coalescing operator)๋ฅผ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค. Null์ธ ๊ฒฝ์ฐ ?? ๋ค์ ๋ํดํธ ๊ฐ์ ๋ฆฌํดํ๊ฒ ๋๋ค.
// rows๊ฐ NULL์ด๋ฉด, cnt๋ 0
// rows๊ฐ NULL์ด ์๋๋ฉด, cnt๋ ์ค์ rows ๊ฐฏ์
int cnt = rows?.Count ?? 0;
2) ๋ฌธ์์ด ๋ณด๊ฐ(String Interpolation)
C#์์ ๋ฌธ์์ด์ ํฌ๋งทํ ํ๊ธฐ ์ํด์๋ string.Format() ์์ ์์ ๋ฌธ์์ด์ {0}, {1}, {2} ๋ฑ๊ณผ ๊ฐ์ ์ธ์๋ฅผ ๋ฃ์ด ํด๋น ์์น์ ํ๋ผ๋ฏธํฐ๋ค์ด ๋ค์ด๊ฐ๊ฒ ํ์๋ค. C# 6.0์์๋ ์ด๋ฌํ ๋ถํธ์ ๋์ด ์ฃผ๊ธฐ ์ํด {} ์์ ์ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ๊ฒ ๋๋ค.
Rectangle r = new Rectangle();
r.Height = 10;
r.Width = 32;
// Format string ์์ $ ๋ฅผ ๋ถ์ด๋ฉฐ {} ์์ ์์ฑ ํน์ ๊ณ์ฐ์ ๋ฑ์ ๋ฃ์ ์ ์๋ค.
string s = $"{r.Height} x {r.Width} = {(r.Height * r.Width)}";
Console.WriteLine(s);
3) Dictionary Initializer
๊ธฐ์กด C#์์ Dictionary๋ฅผ ์ด๊ธฐํํ๋ ์คํ์ผ๊ณผ ์ด๊ธฐํ ํ ์ฌ์ฉํ๋ ์คํ์ผ ๊ฐ์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์๋ค. C# 6.0์์๋ ์ด๋ฌํ ์คํ์ผ๋ค์ ํต์ผ์์ผ ์ด๊ธฐํ ๊ณผ์ ์์๋ Indexer ์คํ์ผ์ ๊ดํธ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
- ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ์ด๊ธฐํํ๊ณ ์ฌ์ฉํ๋๋ฐ ๋์์ด ๋๋ค.
- ํด์ ํ ์ด๋ธ, Dictionary ๋ฟ๋ง ์๋๋ผ, ์ธ๋ฑ์๋ฅผ ์ง์ํ๋ ๋ชจ๋ ๊ฐ์ฒด์์ ์ฌ์ฉ๋ ์ ์๋ค.
// ์ด์ ์ C# ํํ
var scores = new Dictionary<string, int>()
{
{ "kim", 100 },
{ "lee", 90 }
};
int sc = scores["lee"];
// C# 6.0 ํํ
var scores = new Dictionary<string, int>()
{
["kim"] = 100,
["lee"] = 90
};
int sc = scores["lee"];
4) nameof ์ฐ์ฐ์
nameof ์ฐ์ฐ์๋ Type์ด๋ ๋ฉ์๋, ์์ฑ ๋ฑ์ ์ด๋ฆ์ ๋ฆฌํดํ๋ค.
- ํ๋์ฝ๋ฉ์ ์ํ ํ์ดํ ์ค๋ฅ ๋ฐฉ์ง๋ ํน์ ์ฐจํ ๋ฆฌํฉํฐ๋ง์์ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ค๋ค.
// ํ๋ง๋ฏธํฐ๋ช
throw new ArgumentException("Invalid argument", nameof(id));
// ์์ฑ๋ช
Console.WriteLine("{0}: {1}", nameof(objPerson.Height), objPerson.Height);
// ๋ฉ์๋๋ช
void Run() {
Log(nameof(Run) + " : Started");
}