Microsoft MVP성태의 닷넷 이야기
.NET Framework: 1099. C# 10 - (4) 상수 문자열에 포맷 식 사용 가능 [링크 복사], [링크+제목 복사],
조회: 17421
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)
(시리즈 글이 15개 있습니다.)
.NET Framework: 1094. C# 10 - (1) 구조체를 생성하는 record struct
; https://www.sysnet.pe.kr/2/0/12790

.NET Framework: 1096. C# 10 - (2) 전역 네임스페이스 선언
; https://www.sysnet.pe.kr/2/0/12792

.NET Framework: 1097. C# 10 - (3) 개선된 변수 초기화 판정
; https://www.sysnet.pe.kr/2/0/12793

.NET Framework: 1099. C# 10 - (4) 상수 문자열에 포맷 식 사용 가능
; https://www.sysnet.pe.kr/2/0/12796

.NET Framework: 1100. C# 10 - (5) 속성 패턴의 개선
; https://www.sysnet.pe.kr/2/0/12799

.NET Framework: 1101. C# 10 - (6) record class 타입의 ToString 메서드를 sealed 처리 허용
; https://www.sysnet.pe.kr/2/0/12801

.NET Framework: 1103. C# 10 - (7) Source Generator V2 APIs
; https://www.sysnet.pe.kr/2/0/12804

.NET Framework: 1104. C# 10 - (8) 분해 구문에서 기존 변수의 재사용 가능
; https://www.sysnet.pe.kr/2/0/12805

.NET Framework: 1105. C# 10 - (9) 비동기 메서드가 사용할 AsyncMethodBuilder 선택 가능
; https://www.sysnet.pe.kr/2/0/12807

.NET Framework: 1108. C# 10 - (10) 개선된 #line 지시자
; https://www.sysnet.pe.kr/2/0/12812

.NET Framework: 1109. C# 10 - (11) Lambda 개선
; https://www.sysnet.pe.kr/2/0/12813

.NET Framework: 1113. C# 10 - (12) 문자열 보간 성능 개선
; https://www.sysnet.pe.kr/2/0/12826

.NET Framework: 1114. C# 10 - (13) 단일 파일 내에 적용되는 namespace 선언
; https://www.sysnet.pe.kr/2/0/12828

.NET Framework: 1115. C# 10 - (14) 구조체 타입에 기본 생성자 정의 가능
; https://www.sysnet.pe.kr/2/0/12829

.NET Framework: 1116. C# 10 - (15) CallerArgumentExpression 특성 추가
; https://www.sysnet.pe.kr/2/0/12835




C# 10 - (4) 상수 문자열에 포맷 식 사용 가능

C# 6.0부터 문자열 내에 식을 포함하도록 지원했지만,

string text = $"PI = {Math.PI}";

상수로 선언되는 경우에는 식을 사용하는 표현이 허용되지 않았습니다.

const string PI = "3.141592";

// C# 9 이하에서는 컴파일 오류 - error CS0133: The expression being assigned to 'text' must be constant
const string text = $"PI == {PI}";

// C# 9 이하에서는 컴파일 오류 - error CS0133: The expression being assigned to 'space' must be constant
const string space = $"{ " " }";

하지만, C# 10부터는 위의 표현에서 컴파일 오류가 발생하지 않고 최종 문자열을 계산해 "const string"으로 처리합니다. 또한 포맷식이 허용되므로 상수 문자열을 반환하는 nameof도 사용할 수 있습니다.

using System;
const string systemNamespace = $"{nameof(System)}"; // C# 9 이전에는 CS0133 컴파일 오류

// C# 9.0 이하 - [DebuggerDisplay("class " + nameof(C1))]
[DebuggerDisplay($"class {nameof(C1)}")]
public class C1
{
    // C# 9.0 이하 - [Obsolete("field " + nameof(S1) + " is depreacted")]
    [Obsolete($"field {nameof(S1)} is depreacted")]
    const string S1 = "Hello world";
    const string S2 = "Hello" + " " + "World";
    const string S3 = S1 + " Kevin, welcome to the team!";
}

반면, 박싱/언박싱 및 암시적 참조 변환이 이뤄지는 경우에는 여전히 사용할 수가 없습니다. 즉, 다음과 같은 코드는 유효하지 않습니다.

const float fPI = 3.141592F;
const string text = $"PI == {fPI}"; // 컴파일 오류 error CS0133: The expression being assigned to 'text' must be constant

왜냐하면, 위의 식은 사실 다음과 같이 번역되어야 하므로,

"PI == " + fPI.ToString();

상수식으로 평가할 수 없기 때문입니다. 즉, 간단하게 정리하면 문자열 상수와 문자열 리터럴의 조합에 한해 컴파일 시점에 문자열 식에서 최종 문자열을 상수로써 계산/처리할 수 있게 된 것입니다.

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




C# 10 - (1) 구조체를 생성하는 record struct (공식 문서, Static Abstract Members In Interfaces C# 10 Preview)
; https://www.sysnet.pe.kr/2/0/12790

C# 10 - (2) 전역 네임스페이스 선언 (공식 문서, Global Using Directive)
; https://www.sysnet.pe.kr/2/0/12792

C# 10 - (3) 개선된 변수 초기화 판정 (공식 문서, Improved Definite Assignment)
; https://www.sysnet.pe.kr/2/0/12793

C# 10 - (4) 상수 문자열에 포맷 식 사용 가능 (공식 문서, Constant Interpolated Strings)
; https://www.sysnet.pe.kr/2/0/12796

C# 10 - (5) 속성 패턴의 개선 (공식 문서, Extended property patterns)
; https://www.sysnet.pe.kr/2/0/12799

C# 10 - (6) record class 타입의 ToString 메서드를 sealed 처리 허용 (공식 문서, Sealed record ToString)
; https://www.sysnet.pe.kr/2/0/12801

C# 10 - (7) Source Generator V2 APIs (Source Generator V2 APIs)
; https://www.sysnet.pe.kr/2/0/12804

C# 10 - (8) 분해 구문에서 기존 변수의 재사용 가능 (공식 문서, Mix declarations and variables in deconstruction)
; https://www.sysnet.pe.kr/2/0/12805

C# 10 - (9) 비동기 메서드가 사용할 AsyncMethodBuilder 선택 가능 (공식 문서, Async method builder override); 
; https://www.sysnet.pe.kr/2/0/12807

C# 10 - (10) 개선된 #line 지시자 (공식 문서, Enhanced #line directive)
; https://www.sysnet.pe.kr/2/0/12812

C# 10 - (11) Lambda 개선 (공식 문서 1, 공식 문서 2, Lambda improvements) 
; https://www.sysnet.pe.kr/2/0/12813

C# 10 - (12) 문자열 보간 성능 개선 (공식 문서, Interpolated string improvements)
; https://www.sysnet.pe.kr/2/0/12826

C# 10 - (13) 단일 파일 내에 적용되는 namespace 선언 (공식 문서, File-scoped namespace)
; https://www.sysnet.pe.kr/2/0/12828

C# 10 - (14) 구조체 타입에 기본 생성자 정의 가능 (공식 문서, Parameterless struct constructors)
; https://www.sysnet.pe.kr/2/0/12829

C# 10 - (15) CallerArgumentExpression 특성 추가 (공식 문서, Caller expression attribute)
; https://www.sysnet.pe.kr/2/0/12835

Language Feature Status
; https://github.com/dotnet/roslyn/blob/main/docs/Language%20Feature%20Status.md




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/14/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  138  [139]  140  141  142  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1579정성태1/12/201422299오류 유형: 207. System.ArgumentException was unhandled - Message=[net_WebHeaderInvalidControlChars]
1578정성태1/11/201433860개발 환경 구성: 209. Fiddler에서 WebSocket 통신을 모니터링하는 방법 [1]
1577정성태1/11/201424077오류 유형: 206. WriteFile Win32API 사용 시 비정상 종료 현상 [3]
1576정성태1/11/201442010Windows: 81. 긴 이름의 파일/폴더 삭제하는 법 [5]
1575정성태1/11/201422489오류 유형: 205. Exception calling "Provision" with "0" argument(s): "The timer job did not complete running within the allotted time."
1574정성태1/11/201424471오류 유형: 204. An unhandled exception ('System.Security.Cryptography.CryptographicException') occurred in OWSTIMER.EXE
1573정성태1/11/201422260오류 유형: 203. 이벤트 로그 에러 - MsiInstaller에서 Chart Controls 설치 관련 오류 발생
1572정성태1/9/201425753.NET Framework: 406. CoreLab - OraDirect .NET 사용법
1571정성태1/9/201421959.NET Framework: 405. override 메서드가 정의된 타입의 인스턴스로 base 메서드를 호출하는 방법 - 두 번째 이야기
1570정성태1/9/201425337Math: 11. C# 시뮬레이션 - 몬티홀 게임파일 다운로드1
1569정성태1/8/201422528Windows: 80. 윈도우 서버 백업의 복원하는 옵션 설명
1568정성태1/8/201423133오류 유형: 202. Hyper-V 서비스 시작 오류 - Not enough storage is available to complete this operation.
1567정성태1/8/201492472기타: 40. 오피스 2013 라이선스 리셋하는 방법 [5]
1566정성태1/7/201423423Windows: 79. 윈도우 8 - 스카이드라이브(skydrive)의 Online/Offline 동기화 방식 [1]
1565정성태1/3/201421903.NET Framework: 404. 리플렉션을 이용해 닷넷 LicenseManager를 우회할 수 있는 사례
1564정성태1/3/201422455.NET Framework: 403. override 메서드가 정의된 타입의 인스턴스로 base 메서드를 호출하는 방법파일 다운로드1
1563정성태1/3/201428204오류 유형: 201. ASP.NET 웹 사이트를 IIS 7 이상의 환경에서 호스팅할 때 500 오류 발생
1562정성태1/2/201432860.NET Framework: 402. 카카오톡 PC 버전 실행 시 개발자 컴퓨터에서 Themida 오류 나는 문제 - 두 번째 이야기
1561정성태1/1/201442410오류 유형: 200. 카카오톡 PC 버전 실행 시 개발자 컴퓨터에서 Themida 오류 나는 문제 [2]
1560정성태1/1/201421169오류 유형: 199. Hyper-V - Checkpoint 생성 오류
1559정성태12/30/201324408.NET Framework: 401. windbg에서 확인해 보는 관리 힙의 인스턴스 구조 [2]
1558정성태12/29/201333876.NET Framework: 400. 눈으로 확인하는 LayoutKind 옵션 효과 [2]파일 다운로드1
1557정성태12/27/201322928.NET Framework: 399. LayoutKind 옵션에 대해 [2]
1556정성태12/27/201343173개발 환경 구성: 208. IIS + Node.js 환경 구성 [8]
1555정성태12/27/201329930개발 환경 구성: 207. IIS의 80 포트를 공유하는 응용 프로그램 만드는 방법 [1]
1554정성태12/26/201335324Windows: 78. 마음에 드는 윈도우 8.1 태블릿 - 델 베뉴 8 프로 5830 [4]
... 136  137  138  [139]  140  141  142  143  144  145  146  147  148  149  150  ...