[C#] 일반 문자열과 완전 문자열의 차이점은 무엇입니까?

나는 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 StringsC #의 완전 문자열과 같은 새로운 기능이 있습니다.

여러 줄 문자열

전문가 팁 : 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\\.");


답변

Resharper 경고를 제거하려면 다음을 사용할 수 있습니다.

Localizable(false)

매개 변수, 파일 위치 등의 경우 이것은 좋은 해결책이 될 수 있습니다.


답변