C #에서 문자열 앞의 @는 무엇입니까?


602

이것은 C # (또는 가능하면 VB.net)에 대한 .NET 질문이지만 다음 선언의 차이점을 알아 내려고합니다.

string hello = "hello";

vs.

string hello_alias = @"hello";

콘솔에서 인쇄하면 차이가 없으며 길이 속성은 동일합니다.


포맷 더 나은 그대로 문자열은 Visual Studio IDE 내 제안을 참조 (그리고 upvote에)하십시오 : 문자열을 그대로 들여 쓰기 여러 줄을 .
Olivier Jacot-Descombes

명확히하기 위해, 위의 예제는을 사용하거나 사용하지 않고 정확히 동일한 결과를 생성합니다 @.
Miro J.

답변:


767

문자열을 그대로 문자열 리터럴 로 표시합니다. 일반적으로 이스케이프 시퀀스 로 해석되는 문자열 은 무시됩니다.

그래서 "C:\\Users\\Rich"같은@"C:\Users\Rich"

한 가지 예외가 있습니다. 큰 따옴표에는 이스케이프 시퀀스가 ​​필요합니다. 큰 따옴표를 이스케이프하려면 두 개의 큰 따옴표를 한 행에 넣어야합니다. 예를 들어로 @""""평가됩니다 ".


1
@RichardEverett 나는 대답을 이해했지만 내 의심은이 기능의 실제 사용법은 무엇입니까?
Arun

24
@Arun 그것은 종종 스스로 탈출해야하는 정규 표현식 정의와 같은 것들을 포함하는 문자열을 다룰 때 정말 유용합니다
James Thorpe

25
+ 여러 줄 내용
Jaider

4
통화 {{에서 일반 괄호를 사용하려면 여전히 괄호를 두 배로 늘려야 합니다 string.Format.
Dave Cousineau

4
@RichardEverett는 줄을 여러 조각으로 나눌 필요없이 여러 줄 문자열 리터럴을 만드는 데 매우 유용합니다.
John Mott

256

그것은 A의 축 어적으로 문자열 리터럴 . 이스케이프가 적용되지 않았 음을 의미합니다. 예를 들어 :

string verbatim = @"foo\bar";
string regular = "foo\\bar";

여기 verbatimregular같은 내용이 있습니다.

또한 여러 줄 내용을 허용합니다. SQL에 매우 유용 할 수 있습니다.

string select = @"
SELECT Foo
FROM Bar
WHERE Name='Baz'";

완전 문자열 리터럴에 필요한 이스케이프 비트는 큰 따옴표 ( ")를 두 배로 늘려서 얻는 것입니다.

string verbatim = @"He said, ""Would you like some coffee?"" and left.";
string regular = "He said, \"Would you like some coffee?\" and left.";

16
또한 예약어를 변수 이름 및 항목으로 사용할 수 있습니다. public int와 마찬가지로 GetValueOrDefault (int @default);
Svish

5
Svish : 사실이지만이 특정 질문과는 관련이 없습니다.
Jon Skeet

63

'@'도 다른 의미를 갖습니다. 변수 선언 앞에두면 예약 된 키워드를 변수 이름으로 사용할 수 있습니다.

예를 들면 다음과 같습니다.

string @class = "something";
int @object = 1;

나는 이것에 대한 하나 또는 두 개의 정당한 용도만을 찾았습니다. 주로 ASP.NET MVC에서 다음과 같은 작업을 수행하려고합니다.

<%= Html.ActionLink("Text", "Action", "Controller", null, new { @class = "some_css_class" })%>

다음과 같은 HTML 링크가 생성됩니다.

<a href="/Controller/Action" class="some_css_class">Text</a>

그렇지 않으면 예약 키워드가 아니지만 대문자 'C'는 HTML 표준을 따르지 않고 올바르게 보이지 않는 '클래스'를 사용해야합니다.


18

VB도 명시 적으로 요청 했으므로이 그대로의 문자열 구문은 VB에는없고 C #에만 존재한다는 것을 추가하겠습니다. 오히려 모든 문자열은 VB에서 그대로 사용됩니다 (C # 그대로의 문자열과 달리 줄 바꿈을 포함 할 수 없다는 점은 제외).

Dim path = "C:\My\Path"
Dim message = "She said, ""Hello, beautiful world."""

이스케이프 시퀀스는 VB에 존재하지 않습니다 (C # 그대로의 문자열과 같이 따옴표 문자의 배가를 제외하고). 예를 들어 VB에서 다음 코드를 작성하려면 연결 (또는 문자열을 구성하는 다른 방법)을 사용해야합니다.

string x = "Foo\nbar";

VB에서는 다음과 같이 작성됩니다.

Dim x = "Foo" & Environment.NewLine & "bar"

( &VB 문자열 연결 연산자입니다. +동일하게 사용할 수 있습니다.)


1
오 마이, 그거 짜증나 ... C #을 사용하는 것이 훨씬 더 기쁘다 : p
Svish

C #의 그대로 문자열 리터럴에 줄 바꿈을해도 VB 문자열 리터럴에 줄 바꿈을 포함 할 수 없습니다. 따라서 동일하지 않습니다.
Joey

@Svish, 잠깐만 뭔가 빠졌어? 이것은 VB의 단점이 아닙니다. 실제로 이것은 VB가 C #에서이기는 곳입니다. 이 방법을 사용하여 "와 사이에 모든 특수 문자를 던지는 대신 개행 문자와 특수 문자를 명시 적으로 연결하는 것이 좋습니다 ".
Pacerier

@Pacerier 그건 말도 안됩니다. 사소한 스트링 처리 이상을 수행하자마자 적절한 스트링 구축 시설이 필수적이며 특수 문자를 간결하게 처리 할 수있는 기능이 그중에서도 가장 중요합니다. 그러나 C #과 VB는 모두 String.Format이를 수행 할 수 있습니다. 사실, 나는 절대로 쓰지 "x" & Environment.NewLine않고 대신 항상String.Format("x{0}", Environment.Newline) 등을 사용합니다 . 여전히 C #이 더 편리합니다.
Konrad Rudolph

@KonradRudolph, 내가 선택할 것 "x" & nl & nl또는 "x" + nl + nl또는 "x" . $nl . $nl이상 어떤 일 "x\n\n". 또한 "x" + bs + bs 끝났습니다 "x\\\\". 그리고 "x" + q + q이상 "x\"\""/ "x""""". 지금 String.Format은 위의 비교와 관련이없는 또 다른 문제입니다.
Pacerier

10

http://msdn.microsoft.com/en-us/library/aa691090.aspx

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

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

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


9

이 문자열은 축약 형 문자열이며 이스케이프 규칙을 변경합니다. 이제 이스케이프되는 유일한 문자는 ", 이스케이프 된" "입니다. 파일 경로 및 정규식에 특히 유용합니다.

var path = @"c:\some\location";
var tsql = @"SELECT *
            FROM FOO
            WHERE Bar = 1";
var escaped = @"a "" b";

기타


예에서 @을 빠뜨리지 않았습니까, Marc? 아니면 var를 사용할 때 기본값입니까? 조금 혼란스러워 ...
Dirk Vollmar

1
좋습니다. 정말 이상합니다. 편집자가 문을 닫았는지 궁금합니다.
Marc Gravell

9

MSDN 에서 복사 :

컴파일시, 완전 문자열은 모두 동일한 이스케이프 시퀀스를 가진 일반 문자열로 변환됩니다. 따라서 디버거 감시 창에서 완전 문자열을 보면 소스 코드의 완전 버전이 아니라 컴파일러에서 추가 한 이스케이프 문자가 표시됩니다. 예를 들어 동사 문자열 @"C:\files.txt"은 와치 창에로 표시됩니다 "C:\\files.txt".


다음은 일반적으로 오해의 소지가있는 Microsoft 문서 IMHO! 위의 결과는 정확하지만 C #의 문자열은 관련 바이트 시퀀스 (또는 멀티 바이트 문자 코드)로 변환됩니다. C #에서는 @ "..."또는 "..."을 사용하여 기본 문자열을 나타내는 두 가지 방법을 허용합니다. 디버거는 항상 "..."방식을 선택하며 처음에 사용 된 것을 알 수 없습니다. (\ n 또는 ""와 같은 이스케이프 시퀀스는 프로그래밍 및 표시 수준 문자열 표현에만 관련이 있으며 기본 문자열에는 저장되지 않습니다!)
MikeBeaton 2016

8

@문자열 앞에 문자를 넣으면 특수 코드 나 이스케이프 문자를 사용하지 않고도 백 슬래시 나 큰 따옴표와 같은 특수 문자를 사용할 수 있습니다.

그래서 당신은 쓸 수 있습니다 :

string path = @"C:\My path\";

대신에:

string path = "C:\\My path\\";

3

설명은 간단합니다. 문자열을 나타내려면 이스케이프 문자 이므로 "string\"컴파일러에 필요 합니다. 대신 사용 하면에 대해 잊을 수 있습니다 ."string\\"\@"string\"\\

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