C#8.0의 새로운 특성 개요 및 설명
카탈로그
앞말
2018년 11월 12일 마이크로소프트는 MSDN 블로그의 Building C#8.01에 새로운 C#8.0이 곧 발표될 특성을 발표했다.
새로운 변화
비어 있는 참조 유형(Nullable reference types)
따라서 참조 유형은 구분 가능 여부를 구분하여 Null Reference Exception을 근원적으로 해결할 수 있습니다.그러나 이 특성은 호환성을 깨뜨릴 수 있기 때문에 error로 취급하지 않고 Warning 절충을 사용하고 개발자는 수동opt-in을 사용해야 이 특성을 사용할 수 있다(프로젝트 등급이나 파일 등급에서 설정할 수 있다).예:
string s = null; // : null
string? s = null; // Ok
void M(string? s)
{
Console.WriteLine(s.Length); // : null
if (s != null)
{
Console.WriteLine(s.Length); // Ok
}
}
이로써 엄마는 더 이상 내 프로그램이 여기저기 Null Reference Exception에 보고되는 것을 걱정할 필요가 없다.
비동기식 흐름(Async streams)
대부분의 Api와 함수 구현에 대응하는
async
버전이 있는 것을 감안하면 IEnumerable
및 IEnumerator
아직 편리하게 사용할 수 없음 async
/await
은 번거롭다.그러나 이제는 비동기류를 도입해 이 문제들이 해결됐다.우리는 새로운 IAsyncEnumerable
과 IAsyncEnumerator
을 통해 이 점을 실현한다.또한 이전foreach
과IEnumerable
를 바탕으로 이루어졌기 때문에 새로운 문법IEnumerator
을 도입하여 await foreach
의 적용성을 확장했다.예:async Task<int> GetBigResultAsync()
{
var result = await GetResultAsync();
if (result > 20) return result;
else return -1;
}
async IAsyncEnumerable<int> GetBigResultsAsync()
{
await foreach (var result in GetResultsAsync())
{
if (result > 20) yield return result;
}
}
범위 및 아래 첨자 유형(Ranges and indices)
C#8.0은 인덱스 형식을 도입하여 그룹 아래 표시로 사용할 수 있으며, ^ 조작부호를 사용하여 역수를 표시합니다.그러나 주의해야 할 것은 카운트다운은 1부터 시작한다는 것이다.
Index i1 = 3; // 3
Index i2 = ^4; // 4
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"
이외에도 "..."조작부호는 범위를 나타내는 데 쓰인다.
var slice = a[i1..i2]; // { 3, 4, 5 }
이 하표는 0부터 시작하고 역수는 1부터 시작하며 범위는 왼쪽에서 오른쪽으로 닫는다. 필자는 처음에는 이상하다고 생각했지만Python 등 언어는 이미 이런 실천을 했고 효과가 좋다는 것을 발견했다.그래서 이번에도 마이크로소프트는 이런 방식으로 C#8.0의 이 문법을 설계했다.
인터페이스의 기본 구현 방법(Default implementations of interface members)
이 인터페이스에는 다음이 포함될 수 있습니다.
interface ILogger
{
void Log(LogLevel level, string message);
void Log(Exception ex) => Log(LogLevel.Error, ex.ToString()); //
}
class ConsoleLogger : ILogger
{
public void Log(LogLevel level, string message) { ... }
// Log(Exception)
}
위의 예에서
foreach
는 기본적으로 실행될 것입니다.패턴 일치 표현식과 귀속 패턴 문장(Switch expressions and recursive patterns)
이제 이렇게 써도 돼요.
IEnumerable<string> GetEnrollees()
{
foreach (var p in People)
{
if (p is Student { Graduated: false, Name: string name }) yield return name;
}
}
Log(Exception)
p가 Student { Graduated: false, Name: string name }
및 Graduated = false
Name
의 string
인지 확인하고 반복 반환Student
.이렇게 써도 되니까 시원하지 않아요?더욱
var area = figure switch
{
Line _ => 0,
Rectangle r => r.Width * r.Height,
Circle c => c.Radius * 2.0 * Math.PI,
_ => throw new UnknownFigureException(figure)
};
전형적인 패턴은 문장과 일치하지만 "match"키워드가 아니라 "switch"키워드를 사용했다.하지만 어쩔 수 없이 한 글자, 시원해!
대상 유형 유도(Target-typed new-expressions)
이전에 우리가 아래의 변수/구성원 성명을 썼을 때 아마도 가장 간단한 방법은 다음과 같다.
var points = new [] { new Point(1, 4), new Point(2, 6) };
private List<int> _myList = new List<int>();
이제 우리는 이렇게 쓸 수 있다.
Point[] ps = { new (1, 4), new (3,-2), new (9, 5) };
private List<int> _myList = new ();
더 편해졌죠?
주의사항
약간의 생각
참고 문헌
https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0 ↩︎
https://github.com/dotnet/csharplang/issues/39 ↩︎
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 SQLite를 사용한 Windows Forms 앱 개발
Visual Studio 2017에서 SQLite를 사용하여 Windows Forms 앱을 개발해 보았습니다.
아직 서버 탐색기나 TableAdaptor를 사용한 GUI에서의 개발에는 대응하지 않는 것 같습니다.
이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2017에서 SQLite를 사용한 Windows Forms 앱 개발Visual Studio 2017에서 SQLite를 사용하여 Windows Forms 앱을 개발해 보았습니다. 아직 서버 탐색기나 TableAdaptor를 사용한 GUI에서의 개발에는 대응하지 않는 것 같습니다. 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.