나는 Resharper의 시험판을 가지고 있으며 항상 일반 문자열을 그대로 사용하는 문자열로 전환하는 것이 좋습니다. 차이점은 무엇입니까?
나는 Resharper의 시험판을 가지고 있으며 항상 일반 문자열을 그대로 사용하는 문자열로 전환하는 것이 좋습니다. 차이점은 무엇입니까?
답변:
완전 문자열은 파일 이름과 같이 이스케이프 할 필요가없는 문자열입니다.
string myFileName = "C:\\myfolder\\myfile.txt";
될 것이다
string myFileName = @"C:\myfolder\myfile.txt";
@ 기호는 해당 문자열을 문자 그대로 읽고 제어 문자를 해석하지 않는 것을 의미합니다.
이것은 C # 사양의 2.4.4.5 섹션 에서 다룹니다 .
2.4.4.5 문자열 리터럴
C #은 두 가지 형식의 문자열 리터럴 (일반 문자열 리터럴과 완전 문자열 리터럴)을 지원합니다.
일반 문자열 리터럴은 "hello"와 같이 큰 따옴표로 묶은 0 개 이상의 문자로 구성되며 간단한 이스케이프 시퀀스 (예 : 탭 문자의 경우 \ t)와 16 진수 및 유니 코드 이스케이프 시퀀스를 모두 포함 할 수 있습니다.
완전 문자열 리터럴은 @ 문자 뒤에 큰 따옴표 문자, 0 개 이상의 문자 및 닫는 큰 따옴표 문자로 구성됩니다. 간단한 예는 @ "hello"입니다. 완전 문자열 리터럴에서 구분 기호 사이의 문자는 완전하게 해석되며 따옴표-이스케이프 시퀀스는 예외입니다. 특히 간단한 이스케이프 시퀀스와 16 진수 및 유니 코드 이스케이프 시퀀스는 그대로 문자열 리터럴로 처리되지 않습니다. 완전 문자열 리터럴은 여러 줄에 걸쳐있을 수 있습니다.
다시 말해 @ "verbatim 문자열 리터럴"의 유일한 특수 문자는 큰 따옴표 문자입니다. 큰 따옴표가 포함 된 완전 문자열을 쓰려면 큰 따옴표 두 개를 써야합니다. 다른 모든 문자는 문자 그대로 해석됩니다.
그대로 문자열 리터럴에 리터럴 줄 바꿈을 사용할 수도 있습니다. 일반 문자열 리터럴에서는 리터럴 줄 바꿈을 사용할 수 없습니다. 대신 예를 들어 사용해야합니다 "\n"
.
축약 형 문자열 리터럴은 종종 소스 코드에 파일 이름 및 정규식을 임베드하는 데 유용합니다. 이러한 유형의 문자열에는 백 슬래시가 일반적이며 일반 문자열 리터럴이 사용 된 경우 이스케이프해야하기 때문입니다.
일반 문자열 리터럴로 생성 된 문자열과 완전 문자열 리터럴로 생성 된 문자열은 런타임에 차이가 없습니다 System.String
. 둘 다 유형 입니다.
문자열과 완전 문자열 사이에는 런타임 차이가 없습니다. 컴파일 타임에만 다릅니다. 컴파일러는 축약 형 문자열에서 더 적은 이스케이프 시퀀스를 허용하므로 인용 이스케이프 이외의 항목은 무엇이든 얻을 수 있습니다.
또한 축약 문자 @를 사용하여 키워드에 이름을 키워드로 취급하도록 컴파일러에 지시 할 수 있습니다.
var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);
var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);
완전 문자열을 사용하여 여러 줄 문자열을 가질 수도 있습니다.
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
@
오류 없이
VB14에는 Multiline Strings
C #의 완전 문자열과 같은 새로운 기능이 있습니다.
전문가 팁 : VB 문자열 리터럴은 이제 C # 완전 문자열과 동일합니다.
일반 문자열은 특수 이스케이프 시퀀스를 사용하여 특수 문자로 변환합니다.
/*
This string contains a newline
and a tab and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");
완전 문자열은 이스케이프 시퀀스를 변환하지 않고있는 그대로 해석됩니다.
/*
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");