이것은 C # (또는 가능하면 VB.net)에 대한 .NET 질문이지만 다음 선언의 차이점을 알아 내려고합니다.
string hello = "hello";
vs.
string hello_alias = @"hello";
콘솔에서 인쇄하면 차이가 없으며 길이 속성은 동일합니다.
@
.
이것은 C # (또는 가능하면 VB.net)에 대한 .NET 질문이지만 다음 선언의 차이점을 알아 내려고합니다.
string hello = "hello";
vs.
string hello_alias = @"hello";
콘솔에서 인쇄하면 차이가 없으며 길이 속성은 동일합니다.
@
.
답변:
문자열을 그대로 문자열 리터럴 로 표시합니다. 일반적으로 이스케이프 시퀀스 로 해석되는 문자열 은 무시됩니다.
그래서 "C:\\Users\\Rich"
같은@"C:\Users\Rich"
한 가지 예외가 있습니다. 큰 따옴표에는 이스케이프 시퀀스가 필요합니다. 큰 따옴표를 이스케이프하려면 두 개의 큰 따옴표를 한 행에 넣어야합니다. 예를 들어로 @""""
평가됩니다 "
.
{{
에서 일반 괄호를 사용하려면 여전히 괄호를 두 배로 늘려야 합니다 string.Format
.
그것은 A의 축 어적으로 문자열 리터럴 . 이스케이프가 적용되지 않았 음을 의미합니다. 예를 들어 :
string verbatim = @"foo\bar";
string regular = "foo\\bar";
여기 verbatim
와 regular
같은 내용이 있습니다.
또한 여러 줄 내용을 허용합니다. 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 문자열 연결 연산자입니다. +
동일하게 사용할 수 있습니다.)
"
와 사이에 모든 특수 문자를 던지는 대신 개행 문자와 특수 문자를 명시 적으로 연결하는 것이 좋습니다 "
.
String.Format
이를 수행 할 수 있습니다. 사실, 나는 절대로 쓰지 "x" & Environment.NewLine
않고 대신 항상String.Format("x{0}", Environment.Newline)
등을 사용합니다 . 여전히 C #이 더 편리합니다.
"x" & nl & nl
또는 "x" + nl + nl
또는 "x" . $nl . $nl
이상 어떤 일 "x\n\n"
. 또한 "x" + bs + bs
끝났습니다 "x\\\\"
. 그리고 "x" + q + q
이상 "x\"\""
/ "x"""""
. 지금 String.Format
은 위의 비교와 관련이없는 또 다른 문제입니다.
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"
.