C# 11 - 문자열 보간 개선 2가지
C# 11에서는 문자열 보간에 2가지 개선 사항이 있습니다.
우선, 보간식 내에 개행을 허용해서,
Allow new-lines in all interpolations
; https://github.com/dotnet/csharplang/issues/4935
; https://github.com/dotnet/csharplang/blob/main/proposals/new-line-in-interpolation.md
다음과 같은 표현이 가능해졌습니다.
var v = $"Count is\t: { this.Is.A.Really()
.That.I.Should(
be + able)[
to.Wrap()] }.";
개인적으로 저 역시 가끔 보간식을 쓰면서 개행이 아쉬웠던 적이 있었는데 ^^ 반가운 개선 사항입니다.
남은 개선 사항은,
지난 글에 설명한 원시 문자열 리터럴에 문자열 보간 기능이 합쳐지면서 중괄호에 대한 처리 방식이 바뀌었다는 점입니다. 우선, 원시 문자열 리터럴에서도 다음과 같이 보간식을 사용할 사용할 수 있습니다.
Console.WriteLine($"""{Environment.SystemDirectory}"""); // 출력 결과: C:\WINDOWS\system32
그런데, 만약 문자열 내에 출력 목적의 중괄호 '{', '}'가 들어간다면 이에 대한 처리를 (원시 문자열 리터럴이 큰따옴표의 수를 이용했던 방식과 동일하게) 문자열 내에서 허용할 중괄호의 수에 맞게 '
$' 표시를 추가하는 식으로 처리합니다.
Console.WriteLine($$"""{시스템 경로} == {{Environment.SystemDirectory}}""");
Console.WriteLine($$$"""{{시스템 경로}} == {{{Environment.SystemDirectory}}}""");
/* 출력 결과
{시스템 경로} == C:\WINDOWS\system32
{{시스템 경로}} == C:\WINDOWS\system32
*/
위와 같은 방식은 json 문자열을 처리할 때 그 효과가 극대화됩니다. 가령 기존에는 보간식이 있는 json 문자열을 이렇게 표현했지만,
string text = $@"{{
""runtimeOptions"": {{
""tfm"": ""net6.0"",
""framework"": {{
""name"": ""Microsoft.NETCore.App"",
""version"": ""{Environment.Version}""
}}
}}
}}
";
Console.WriteLine(text);
/* 출력 결과
{
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "6.0.6"
}
}
}
*/
C# 11부터는 원시 문자열과 보간식 처리를 이렇게 할 수 있습니다.
string text = $$"""
{
"runtimeOptions": {
"tfm": "net6.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "{{Environment.Version}}"
}
}
}
""";
보는 바와 같이 표현이 훨씬 더 간결해졌습니다.
C# 11 - 원시 문자열 리터럴(공식 문서, raw string literals)
; https://www.sysnet.pe.kr/2/0/13085
C# 11 - 문자열 보간 개선 2가지(공식 문서, Allow new-lines in all interpolations)
; https://www.sysnet.pe.kr/2/0/13086
C# 11 - ref 필드(공식 문서, ref fields)
; https://www.sysnet.pe.kr/2/0/13015
Language Feature Status
; https://github.com/dotnet/roslyn/blob/main/docs/Language%20Feature%20Status.md
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]