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


166

나는 Resharper의 시험판을 가지고 있으며 항상 일반 문자열을 그대로 사용하는 문자열로 전환하는 것이 좋습니다. 차이점은 무엇입니까?


3
ReSharper에서이 제안을 본 적이 없습니다. 이것을 제안하는 예를 들어 줄 수 있습니까?
존 손더스

3
방금 받았어요 첫 번째 제안은 리소스로 옮기는 것이었지만 두 번째는 그대로 문자열로 만드는 것이 었습니다. MessageBox.Show ( "작은 오리너구리는 작업을 진행하기 전에 먼저 멈춰야합니다.");
B. Clay Shannon

나는 아직도 그것을 항상 얻는다. 일반적으로 끄려는 경고 중 하나입니다. 왜냐하면 문자열을 아무 이유없이 그대로 만들 것을 제안하기 때문입니다.
Dean Swiatek

Visual Studio IDE에 대해 제안 된 기능이 마음에 들면 여기에서
투표

답변:


191

완전 문자열은 파일 이름과 같이 이스케이프 할 필요가없는 문자열입니다.

string myFileName = "C:\\myfolder\\myfile.txt";

될 것이다

string myFileName = @"C:\myfolder\myfile.txt";

@ 기호는 해당 문자열을 문자 그대로 읽고 제어 문자를 해석하지 않는 것을 의미합니다.


12
왜 Resharper가 이러한 변화를 제안하는지 궁금합니다. 이스케이프 문자를 무시할 수 있기 때문에 완전 문자열이 더 효율적으로 처리되는지 CLR 전문가가 알고 있습니까?
매트 피터슨

9
나는 동사 문자열이 더 읽기 쉽기 때문에 ReSharper가 제안한다고 생각합니다.
andyp

36
나는 그것이 일종의 코딩 규칙이라고 생각합니다 (이전에 본 적이 없거나 들어 본 적이 없습니다). 문자열 ReSharper는 현지화를 위해 리소스 파일로 이동하거나 그대로 만들 것을 제안합니다. 즉, 문자열 ReSharper는 더 이상 문자열을 현지화하는 옵션을 제공하지 않습니다. 따라서 현지화가 필요없는 모든 문자열을 그대로 사용하는 것이 관례처럼 보입니다.
Daniel Brückner

문자열 변수에 문자열 리터럴이 할당되었다고 가정합니다. string myFileName = "C : \\ myfolder \\ myfile.txt"; 이제 myFileName 문자열 변수를 그대로 문자열로 변환하고 싶습니다. 어떻게합니까? 이 작동합니까? 문자열 verbatimStr = @myFileName;
sanjeev bhusal

3
@sanjeevbhusal : 당신은 실제로 그렇게하지 않습니다. @ "C : \ myfolder \ myfile.txt"및 "C : \\ myfolder \\ myfile.txt"는 CLR과 동일합니다. 기본적으로 구문 설탕 일뿐입니다.
alc6379

68

이것은 C # 사양의 2.4.4.5 섹션 에서 다룹니다 .

2.4.4.5 문자열 리터럴

C #은 두 가지 형식의 문자열 리터럴 (일반 문자열 리터럴과 완전 문자열 리터럴)을 지원합니다.

일반 문자열 리터럴은 "hello"와 같이 큰 따옴표로 묶은 0 개 이상의 문자로 구성되며 간단한 이스케이프 시퀀스 (예 : 탭 문자의 경우 \ t)와 16 진수 및 유니 코드 이스케이프 시퀀스를 모두 포함 할 수 있습니다.

완전 문자열 리터럴은 @ 문자 뒤에 큰 따옴표 문자, 0 개 이상의 문자 및 닫는 큰 따옴표 문자로 구성됩니다. 간단한 예는 @ "hello"입니다. 완전 문자열 리터럴에서 구분 기호 사이의 문자는 완전하게 해석되며 따옴표-이스케이프 시퀀스는 예외입니다. 특히 간단한 이스케이프 시퀀스와 16 진수 및 유니 코드 이스케이프 시퀀스는 그대로 문자열 리터럴로 처리되지 않습니다. 완전 문자열 리터럴은 여러 줄에 걸쳐있을 수 있습니다.

다시 말해 @ "verbatim 문자열 리터럴"의 유일한 특수 문자는 큰 따옴표 문자입니다. 큰 따옴표가 포함 된 완전 문자열을 쓰려면 큰 따옴표 두 개를 써야합니다. 다른 모든 문자는 문자 그대로 해석됩니다.

그대로 문자열 리터럴에 리터럴 줄 바꿈을 사용할 수도 있습니다. 일반 문자열 리터럴에서는 리터럴 줄 바꿈을 사용할 수 없습니다. 대신 예를 들어 사용해야합니다 "\n".

축약 형 문자열 리터럴은 종종 소스 코드에 파일 이름 및 정규식을 임베드하는 데 유용합니다. 이러한 유형의 문자열에는 백 슬래시가 일반적이며 일반 문자열 리터럴이 사용 된 경우 이스케이프해야하기 때문입니다.

일반 문자열 리터럴로 생성 된 문자열과 완전 문자열 리터럴로 생성 된 문자열은 런타임에 차이가 없습니다 System.String. 둘 다 유형 입니다.


27

문자열과 완전 문자열 사이에는 런타임 차이가 없습니다. 컴파일 타임에만 다릅니다. 컴파일러는 축약 형 문자열에서 더 적은 이스케이프 시퀀스를 허용하므로 인용 이스케이프 이외의 항목은 무엇이든 얻을 수 있습니다.

또한 축약 문자 @를 사용하여 키워드에 이름을 키워드로 취급하도록 컴파일러에 지시 할 수 있습니다.

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);

16

완전 문자열을 사용하여 여러 줄 문자열을 가질 수도 있습니다.

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

@오류 없이

VB14에는 Multiline StringsC #의 완전 문자열과 같은 새로운 기능이 있습니다.

여러 줄 문자열

전문가 팁 : VB 문자열 리터럴은 이제 C # 완전 문자열과 동일합니다.


13

일반 문자열은 특수 이스케이프 시퀀스를 사용하여 특수 문자로 변환합니다.

/*
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\\.");

0

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

Localizable(false)

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.