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

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

string hello = "hello";

vs.

string hello_alias = @"hello";

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



답변

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

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

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


답변

그것은 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.";


답변

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

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

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 표준을 따르지 않고 올바르게 보이지 않는 ‘클래스’를 사용해야합니다.


답변

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 문자열 연결 연산자입니다. +동일하게 사용할 수 있습니다.)


답변

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

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

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

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


답변

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

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

기타


답변

MSDN 에서 복사 :

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