2008-10-31 2 views
116

저는 C#의 레거시 코드로 작업 해 왔으며 변수 이름 앞에 @ 기호가 많이 표시되었습니다. 이것은 무엇을 의미합니까?C# 변수 이름 앞에 @를 삽입하면 어떻게됩니까?

현재 예약되지 않은 공통 이름이있는 변수 앞에 많이 있습니다. 예 :

MyProcedure(@step.LoadInstanceId, @step.ResultCode, @step.StatusCode); 

해당 단계가 예약어가 아니므로 이스케이프해야하는 이유가 있습니까?

+0

몇 가지 예를 보여줍니다. @public 같은 예약어 나 @weddingDate와 같은 변수 이름입니까? – kloucks

답변

154

예약 된 키워드를 vars로 선언 할 수있는 유일한 방법입니다.

void Foo(int @string) 
+3

그 말이 맞습니다. 그러나 사람들이 어째서 바보 인 원래 개발자가 아닌 키워드가 아닌 변수 이름 앞에 붙이는 이유를 생각해 볼 수 있습니까? –

+1

제 생각 엔 이전 코더가 어떻게 작동하는지 몰랐습니다. –

+0

어쩌면 그는 확신하고 싶었을 것입니다. 변수가 갑자기 예약어로 바뀌면! –

5

이렇게하면 C#의 예약어를 이스케이프 처리합니다.

33

'public'과 같은 예약어를 변수 이름으로 사용할 수 있습니다. 그것은 불필요한 혼란을 초래할 수

string @public = "foo"; 

나는이를 추천하지 않을 것입니다.

15

문자열 앞에 @를 올리면 문자열 내에서 발견 된 이스케이프 시퀀스를 처리하지 말아야합니다. the documentation에서

:

@ -quoting의 장점은 이스케이프 시퀀스는 쉽게 예를 들어, 완전한 파일 이름, 쓰기 할 수있는 처리되지 않습니다 즉 :

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt" 

포함하려면 에 @ -quoted 문자열 따옴표, 그것은 두배 :

@"""Ahoy!"" cried the captain." // "Ahoy!" cried the captain. 

@ 기호의 또 다른 용도는 참조 사용하는 것이다 (/ 기준) 식별자 C# 키워드 일 수 있습니다. 자세한 내용은 2.4.2 Identifiers을 참조하십시오.

+5

문자열 리터럴이 아닌 변수입니다. –

+2

@Orion : 예 끝 부분에도 설명되어 있습니다. –

+0

일단 문자열이 변수에 포함되면 문자열에 변수를 할당하기 위해 구문 분석되어야하므로 이미 이스케이프되었습니다. @를 문자열 변수에 추가하는 것은 문자열 리터럴에 추가하는 것과 같지 않습니다. –

3

원본 질문은 예약어가 아닌 사람을 피하는 이유를 묻습니다. 내 마음에 떠오르는 점은 앞으로 step이 예약어가 될 경우 코드 예제가 여전히 컴파일된다는 것입니다. 코드 생성기에 대한 유효한 옵션이라고 생각합니다.

2

@ 기호는 언어 키워드와 동일한 식별자와 함께 사용됩니다. - C# 코드가 아닌 코드와 상호 운용되는 두 가지 주요 용도가 있습니다. VB 나 IronPython과 같은 언어에서 키워드는 C#과 같지 않으며 C# 키워드와 일치하는 이름으로 클래스 및 속성을 선언했을 수도 있습니다. 이 기능이 없으면이 코드는 C#에서 액세스 할 수 없습니다. - 기계 생성 코드. 코드 생성기가 일부 외부 소스 (예 : WSDL)를 기반으로 코드를 생성하는 경우 생성기는 모든 식별자 앞에 @를 붙이고 C# 키워드와 일치하는 식별자를 확인 및 변환하지 않을 수 있습니다.

케이스가 두 번째가 아닌 것이 확실합니까?

관련 문제