C# 7.0์ ์๋ก์ด ๊ธฐ๋ฅ
- ํจํด ๋งค์นญ
- ํํ (Tuple)
- ๋ก์ปฌ ํจ์ (Local Function)
- out ํ๋ผ๋ฏธํฐ
- ์๋ฆฟ์ ๋ถ๋ฆฌ์์ ์ด์ง ๋ฆฌํฐ๋ด
- Deconstructor
- ref local๊ณผ ref return
- async ์ปค์คํ ๋ฆฌํด ํ์
- ํฅ์๋ Expression-bodied ํํ
- throw expression
https://www.csharpstudy.com/Latest/CS7-new-features.aspx
1. ํจํด(Pattern) ๋งค์นญ
ํจํด ๋งค์นญ์ด๋ ์ถ์์ ์๋ฏธ์์ ์ด๋ค ๋์์ด ํน์ ํ ํจํด์ ๊ฐ์ง๊ณ ์๋๊ฐ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ผ๋ก ์ด๋ ํ ๊ฐ์ฒด ๋ฆฌ์คํธ์์ ํน์ ํ ์ฑ๊ฒฉ์ ๊ฐ๋ ๊ฐ์ฒด๋ค์ ์ถ์ถํด ๋ผ ๋ ํจํด ๋งค์นญ์ ์ฌ์ฉํ ์ ์๋ค.
C# 7.0์์๋ ์๋ 3๊ฐ์ง ํจํด์ ์ง์ํ๊ณ ์์ผ๋ฉฐ is ์ฐ์ฐ์์ switch ๋ฌธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ์์ ํจํด(const pattern): ํน์ ์์๊ฐ์ ์ฌ์ฉํด์ ํจํด์ ์ฒดํฌํ๋ค.
- ํ์ ํจํด(type pattern): ์ด๋ค ๊ฐ์ฒด๊ฐ ํด๋น ํ์ ์ ํน์ ๊ทธ ํ์ํด๋์ค์ ๊ฐ์ฒด์ธ์ง, ๋๋ ์ด๋ค ์ธํฐํ์ด์ค ํ์ ์ ๊ฐ์ง๊ณ ์๋์ง ๋ฑ์ ์ฒดํฌํ๋ ๊ฒ์ผ๋ก ์ถ๊ฐ๋ก C# 7.0์์๋ ํด๋น ํ์ ์ ์์ํ๋ ์๋ก์ด ๋ณ์๋ฅผ ์ ๊ณตํ์ฌ ํด๋น ํ์ ์ ์์ฑ์ ์บ์คํ ์์ด ์ง์ ์ฌ์ฉํ ์ ์๋ค.
- var ํจํด(var pattern): ํ์ ๋์ var๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.
1) is ์ฐ์ฐ์
์ด์ ์๋ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ง์ ๋ ํ์ ์ ๊ฐ์ฒด์ธ์ง๋ฅผ ์ฒดํฌํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋์์ผ๋ฉฐ is ์ฐ์ฐ์ ๋ค์๋ ํญ์ ํ์ ์ ์ง์ ํด์ผ ํ๋ค. C# 7.0์์๋ ํ์ ์ด์ธ์ ํจํด์ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
object[] data = { 1, null, 10, new Circle(5), new Person("Lee"), "" };
foreach (var item in data)
{
// 1. ์์ ํจํด(const pattern)
if (item is null)
{
Console.WriteLine("NULL ์ฐพ์์");
}
else if (item is 10)
{
Console.WriteLine("10 ์ฐพ์์");
}
// 2. ํ์
ํจํด(type pattern)
if (item is Circle circ)
{
WriteLine(circ.Radius);
}
}
2) switch ๋ฌธ
์ด์ ์๋ int, string, bool ๋ฑ์ ๊ธฐ๋ณธ ํ์ ๋ง ์ฌ์ฉํ ์ ์์๋ค. C# 7.0์์๋ ํจํด ๋งค์นญ์ ์ํด ์ฌ์ฉ๋ ์ ์๊ฒ ๋์๋ค.
private void PrintArea(List<Shape> shapes)
{
foreach (var shape in shapes)
{
switch (shape)
{
// 1. ์์ ํจํด(const pattern)
case null:
WriteLine("Skip");
break;
// 2. ํ์
ํจํด(type pattern)
case Circle c:
WriteLine($"์: {c.Radius * c.Radius * Math.PI}");
break;
case Rect r when r.Width == r.Height:
WriteLine($"์ ์ฌ๊ฐํ: {r.Width * r.Width}");
break;
case Rect r:
WriteLine($"์ฌ๊ฐํ: {r2.Width * r2.Height}");
break;
default:
WriteLine("๋ชจ๋ฅด๋ ๋ชจ์");
break;
}
}
}
class Shape {}
class Circle : Shape { /* ์๋ต */ }
class Rect : Shape { /* ์๋ต */ }
List<int> vip = new List<int> { 1, 3, 5, 9 };
List<int> active = new List<int> { 10, 13, 15, 19 };
List<int> blacklist = new List<int> { 7, 14, 12, 133 };
private void CheckCustomer(int id)
{
switch(id)
{
// 3. var ํจํด(var pattern)
case var _id when (vip.Contains(_id)):
WriteLine("VIP");
// VIP
break;
case var _id when (active.Contains(_id)):
//...
break;
case var _id when (blacklist.Contains(_id)):
//...
break;
default:
//...
break;
}
}