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


298

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

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

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

답변:


306

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

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


2
최소 목표 .NET 지원 버전은 @무엇입니까?
serhio

16
.NET 자체는 @이와 같은 기호를 정의하지 않으며 C # 언어 사양과 같습니다. 첫 번째 버전 인 C # 1.0 (.NET 1.0으로 출시) 이후로이 기능을 지원했습니다. csharpindepth.com/articles/chapter1/Specifications.aspx
Tim S.

9
궁금한 점이 있으시면 VB.NET [ ]에서 예를 들어 동사 식별자를 지정하는 데 사용할 수 있습니다 Dim [String] As String.
MicroVirus

74

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


6
@rslite : +1 권장하지 않음 :)
7116

4
> 결코 한 권장되지 않음,하지만 결코 결코 말하지. 예를 들어 C # 키워드를 식별자로 사용하는 레거시 COM 인터페이스를 구현해야 할 수 있습니다. 또는 Microsoft는 새로운 버전의 프레임 워크에 새로운 키워드를 도입 할 수 있습니다 (예 : .NET 1.1 채권 거래 앱의 수익률 :)
Joe

2
@Joe : 새 yield키워드는 예약어가 아니며 합법적으로 식별자가 표시되지 않는 컨텍스트에서만 사용할 있습니다. C # 용 새 기능을 디자인 할 때 한 가지 목표는 새 기능을 추가하기 전에 합법적 인 프로그램이 나중에 합법적 이고 동일한 의미를 갖도록 구성하는 것 입니다.
supercat

6
@Html.TextboxFor( , , , new { @class="my-css-class" } )HTML을 수동으로 작성하거나 나중에 자바 스크립트에서 속성을 변경하지 않고도 실제로 해결할 수없는 좋은 예입니다.
Flater

C # 코드에서 모든 변수 앞에 "@"기호가 붙는 오픈 소스 소프트웨어에서 볼 수있는 새로운 트렌드가 있습니다. 나는 이것이 변수에 대한 PHP 소프트웨어 의이 요구 사항의 친숙성 때문일 수 있다고 생각합니다. 그리고 많은 오픈 소스 웹 시스템이 이제 C #으로 코딩되었습니다 (과거에는 PHP
였음

36

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

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


규칙이 "verbatim-"또는 " here-strings " 매개 변수 명명 간에 동일하다는 흥미로운 점 (및 유용한 니모닉)입니다 .
ruffin 2015 년

13

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

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

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

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

> string @string;

10

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

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

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

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

string public = "This will not compile";

4

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


3

또 다른 사용 사례는 확장 방법입니다. 첫 번째 특수 매개 변수는 @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];
    }

1

키워드를 식별자의 이름으로 사용하는 경우 컴파일러 오류 "식별자, '식별자 이름'은 키워드입니다"라는 오류가 발생합니다.이 오류를 극복하려면 식별자 앞에 "@"를 붙입니다. 이러한 식별자는 완전 식별자입니다. @ 문자는 실제로 식별자의 일부가 아니므로 다른 언어에서는 식별자가 접두사없이 일반 식별자로 표시 될 수 있습니다.


1

예약 키워드를 변수 이름으로 사용하는 데 사용할 수 있습니다

 int @int = 3; 

컴파일러는를 무시 @하고 변수를 다음 과 같이 컴파일합니다.int

생각을 사용하는 것은 일반적인 관행이 아닙니다

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