여러분이 바라는 c# 10의 기능은 무엇이 있나요?

어느덧 C#도 10.0 버전을 바라보게 되었네요. 아직은 개발 중이지만, C# 10에도 흥미로운 기능들이 꽤 많이 거론되고 있습니다. 여러분께서 바라는 C# 10의 새로운 기능은 어떤것이 있나요?

C# 10 — 3 Candidate Features That Could Make the Final Cut | Young Coder | Matthew MacDonald | Young Coder (medium.com)

좋아요 2

가장 먼저 떠오르는 것은 아래 두 가지 정도네요.

좋아요 3

Rust와 같은 현대 언어들의 문자열 인코딩은 UTF-8입니다.

https://doc.rust-lang.org/std/string/struct.String.html
https://rinthel.github.io/rust-lang-book-ko/ch08-02-strings.html

C#은 시대적 배경 (C#이 태동할 즈음에는 아직 문자열 인코딩으로 UTF-8을 대중적으로 사용하지 않았음)과 Windows 기반 (Windows API들은 ASCII 및 UNICODE(UTF-16) 인코딩이였음)이라는 배경 때문에 UTF-16를 기본 문자열 인코딩으로 채택했습니다.

웹 인프라가 급속도로 늘어나고 UTF-8 인코딩을 사용하는것이 대세가 되면서, C#은 에매한 포지션에 놓이게 되었습니다. 왜냐하면, 기본 인코딩이 UTF-8인 언어에 비해 UTF-8 → 16, 16 → UTF-8로 변환해야만 하는 부하가 생겼거든요. 그렇다고 문자열 인코딩을 UTF-8로 바꾼다고 모든 문제가 해결되는 것도 아니였습니다. 이에 관련된 오랜 논의는 아래를 참고할 수 있습니다.

Utf8String design proposal · Issue #2350 · dotnet/corefxlab (github.com)

저는 개인적으로 C#의 문자열 기본 인코딩이 UTF-8이 되기를 바랍니다.

좋아요 2

=> 만 허용하는 로컬 속성이 있으면 좋겠습니다.

예시를 들어볼께요.

var age = 44;
var height = 182;
var score = (float)height / age;

Console.WriteLine(score);
Console.WriteLine(GetStrangeScore());

// 로컬 메소드 가능
float GetStrangeScore() => (float)height / age;
// 클로저(?) 없는 로컬 메소드 가능
static float GetStrangeScore2(int age, int height) => (float)height / age;

// CS0116, CS8801 오류 발생
//float StrangeScore => (float)height / age;  

위의 코드는 최상위 문 덕분에 .NET 5 부터 실행되는 코드입니다.
그런데 반복되는 연산을 위해 StrangeScore 같이 속성으로 활용하면 좋은 사례도 왕왕 발생하는데요,
현재 .NET 6 Preview 2 컴파일러에서도 지원하지 않습니다. (논의가 되고 있는지는 모르겠네요)

현재 로컬 영역에서의 속성 활용은 그 활용도가 낮기 때문에 로컬 속성은 허용하지 않는데요,
속성의 축약이 코드 량을 줄이는 목적과 { get; private set; } 등의 접근 제한의 기능도 있기 때문에,

=> 이정도의 표현은 허용하면 활용가치가 높을 것 같은데요,
또 컴파일러가 최적화 할 수 있는 힌트도 줄 수 있기 때문에, (몇회 이상 반복하면 캐시 한다는 등) 추가되었으면 합니다.