[C#] C #에서 변수 이름에 @ 문자를 사용 / 의미하는 것은 무엇입니까?

C #에서 ‘@’문자로 변수 이름을 시작할 수 있음을 발견했습니다. 내 C # 프로젝트에서 Java로 작성된 웹 서비스 (프로젝트에 웹 참조를 추가했습니다)를 사용하고있었습니다. WSDL에 정의 된 인터페이스 오브젝트 중 하나에 이름이 “params”인 멤버 변수가 있습니다. 분명히 이것은 C #에서 예약어이므로 이름이 “params”인 멤버 변수를 가진 클래스를 가질 수 없습니다. 생성 된 프록시 오브젝트에는 다음과 같은 특성이 있습니다.

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

VS 2008 c # 설명서를 검색했지만 아무것도 찾지 못했습니다. 또한 Google 검색으로 유용한 답변을 얻지 못했습니다. 변수 / 속성 이름에서 ‘@’문자의 정확한 의미 또는 사용은 무엇입니까?



답변

스트레이트에서 C # 언어 사양 , 식별자 (C #을)
:

접두사 “@”를 사용하면 키워드를 식별자로 사용할 수 있으며 다른 프로그래밍 언어와 인터페이스 할 때 유용합니다. @ 문자는 실제로 식별자의 일부가 아니므로 다른 언어에서는 식별자가 접두사없이 일반 식별자로 표시 될 수 있습니다. @ 접두사가있는 식별자를 완전 식별자라고합니다.


답변

예약어를 변수 이름으로 사용할 수 있습니다. IMHO (권장 사항이없는 경우 제외)를 권장하지 않습니다.


답변

C #에서 at (@) 문자는 언어 사양의 관련 규칙을 명시 적으로 준수하지 않는 리터럴을 나타내는 데 사용됩니다.

특히 예약 된 키워드와 충돌하는 변수 이름에 사용할 수 있습니다 (예 : 매개 변수는 사용할 수 없지만 언어 사양의 다른 키워드와 동일하게 @params를 대신 사용할 수 있음). 또한 이스케이프 처리되지 않은 문자열 리터럴에 사용할 수 있습니다. 이것은 경로 상수와 특히 관련 path = "c:\\temp\\somefile.txt"이 있습니다 path = @"c:\temp\somefile.txt". 예를 들어 쓸 수 있습니다 . 정규 표현식에도 유용합니다.


답변

Perl의시길과 달리 @C #에서 변수 이름 앞 의 접두사는 의미가 없습니다. x변수 인 경우 @x동일한 변수의 다른 이름입니다.

> string x = "abc";
> Object.ReferenceEquals(x, @x).Dump();
True

그러나 @접두사는 가지고 사용을 당신은 C #을 불법으로 그렇지 않으면 거부 할 것이라고 변수 이름을 명확히하는 데 사용할 수 있습니다 – 당신이 발견 한대로.

> string string;
Identifier expected; 'string' is a keyword

> string @string;


답변

@기호를 사용하면 변수 이름에 예약 키워드를 사용할 수 있습니다. 같은 @int, @string, @double

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

string @public = "Reserved Keyword used for me and its fine";

위의 코드는 정상적으로 작동하지만 아래에서는 작동하지 않습니다.

string public = "This will not compile";


답변

예약어를 변수 이름으로 사용할 수 있습니다. 요 event전날 var를 원했습니다 . 나는 _event대신 에 갈 텐데 , 동료가 @event대신 전화 할 수 있다는 것을 상기시켰다 .


답변

또 다른 사용 사례는 확장 방법입니다. 첫 번째 특수 매개 변수는 @this이름 으로 실제 의미를 나타 내기 위해 구별 될 수 있습니다 . 예를 들면 :

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this,
    TKey key,
    TValue defaultValue)
    {
        if (!@this.ContainsKey(key))
        {
            return defaultValue;
        }

        return @this[key];
    }