C# 8.0์ ์๋ก์ด ๊ธฐ๋ฅ
3. Nullable Reference Type
์ด์ ๋ฒ์ ์์๋ reference ํ์ ์ null์ ํ ๋นํ ์ ์์ด Null Reference Exception์ด ์์ฃผ ๋ฐ์๋๊ณค ํ๋ค. ๊ทธ๋์ C# 8.0์์๋ reference ํ์ ์ null์ ํ ๋นํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ๋์๋ค.
- reference ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก null์ ๋ฃ์ ์ ์๋ Non-nullable Reference Type์ด ๋๊ณ , NULL์ ํ์ฉํ๊ธฐ ์ํด์๋ ๋ ํผ๋ฐ์ค ํ์ ๋ค์ ๋ฌผ์ํ(?)๋ฅผ ๋ถ์ฌ Nullable Reference Type์์ ํ์ํด์ผ ํ๋ค.
- Nullable Reference Type ๊ธฐ๋ฅ์ ๋ํดํธ๋ก Disable ๋์ด ์์ผ๋ฉฐ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ๋ก์ ํธ ๋ ๋ฒจ์ด๋ ํ์ผ ๋ ๋ฒจ, ํน์ ์์ค์ฝ๋ ๋ด์ ์์์ ์์น์์ Enable ํด์ผ ํ๋ค.
static void Main(string[] args)
{
// nullable enable
string s1 = null; // Warning: Converting null literal or possible null value to non-nullable type
if (s1 == null) return;
string? s2 = null;
if (s2 == null) return;
// nullable disable
string s3 = null; // No Warning
if (s3 == null) return;
}
4. ์ธ๋ฑ์ฑ๊ณผ ์ฌ๋ผ์ด์ฑ
1) ์ธ๋ฑ์ฑ
System.Index ๊ตฌ์กฐ์ฒด๋ ์ํ์ค์ ์์ ๋๋ ๋์ผ๋ก๋ถํฐ ์ธ๋ฑ์ฑ์ ํํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ^ prefix ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ํ์ค๋ฅผ ๋ค์์๋ถํฐ ์ธ๋ฑ์ฑํ ์ ์๋ค. ์ํ์ค์ ๋ ์ธ๋ฑ์ค๋ฅผ ^1, ๋์์ 2๋ฒ์งธ๋ ^2, ๋์์ 3๋ฒ์งธ๋ ^3๊ณผ ๊ฐ์ด ํ์ํ๋ค.
string s = "Hello World";
// System.Index
Index idx = ^2;
ch = s[idx]; // l
// ์
char ch1 = s[0]; // H
char ch1 = s[1]; // e
char ch2 = s[^1]; // d
char ch2 = s[^2]; // l
2) ์ฌ๋ผ์ด์ฑ
System.Range ๊ตฌ์กฐ์ฒด๋ ์์๊ณผ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ํจ๊ป ๊ฐ์ง๋ฉฐ ๋ฒ์๋ฅผ ํํํ ๋ ์ฌ์ฉ๋๋ค.
- .. ๋ฒ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ํ์ค์ ๋ถ๋ถ ์ธ๋ฑ์ค๋ฅผ ํ์ํ ์ ์๋ค.
- ๋ง์ง๋ง ์ธ๋ฑ์ค๋ ์ค์ ๋ฒ์์ ๋ง์ง๋ง ๋ค์ ์์์ด๋ค. ์ฆ, Range ๊ฐ 1..4์ด๋ฉด 1๋ถํฐ 3๊น์ง๊ฐ ์ค์ ๋ฒ์๊ฐ ๋๋ค.
string s = "Hello World";
// System.Range
Range r1 = 1..4;
string str1 = s[r1]; // ell
Index start = r1.Start;
bool b = start.IsFromEnd; // false
int v1 = start.Value; // 1
int v2 = r1.End.Value; // 4
// ์
var s1 = s[1..4]; // ell
var s2 = s[^5..^2]; // Wor
var s3 = s[..]; // Hello World
var s4 = s[..3]; // Hel
var s5 = s[3..]; // lo World
Range rng = 1..^0;
var s6 = s[rng]; // ello World