Việc sử dụng / ý nghĩa của ký tự @ trong tên biến trong C # là gì?


298

Tôi phát hiện ra rằng bạn có thể bắt đầu tên biến của mình bằng ký tự '@' trong C #. Trong dự án C # của tôi, tôi đã sử dụng một dịch vụ web (tôi đã thêm một tham chiếu web vào dự án của mình) được viết bằng Java. Một trong các đối tượng giao diện được xác định trong WSDL có một biến thành viên với tên "params". Rõ ràng đây là một từ dành riêng trong C # vì vậy bạn không thể có một lớp với biến thành viên có tên "params". Đối tượng proxy được tạo có chứa một thuộc tính trông như thế này:

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

Tôi đã tìm kiếm thông qua tài liệu c # VS 2008 nhưng không thể tìm thấy gì về nó. Ngoài ra, việc tìm kiếm Google không cho tôi bất kỳ câu trả lời hữu ích nào. Vậy ý nghĩa chính xác hoặc việc sử dụng ký tự '@' trong tên biến / thuộc tính là gì?

Câu trả lời:


306

Thẳng từ Specification C # Ngôn ngữ , định danh (C #) :

Tiền tố "@" cho phép sử dụng từ khóa làm định danh, rất hữu ích khi giao tiếp với các ngôn ngữ lập trình khác. Ký tự @ không thực sự là một phần của mã định danh, do đó, mã định danh có thể được nhìn thấy trong các ngôn ngữ khác như một mã định danh thông thường, không có tiền tố. Một định danh có tiền tố @ được gọi là định danh nguyên văn.


2
phiên bản tối thiểu được nhắm mục tiêu của .NET hỗ trợ là @gì?
serhio

16
Bản thân .NET không định nghĩa @biểu tượng như thế này, đặc tả ngôn ngữ C #. Nó đã hỗ trợ điều này kể từ phiên bản đầu tiên, C # 1.0 (được phát hành với .NET 1.0). csharpindepth.com/articles/ch CHƯƠNG1 / Spifying.aspx
Tim S.

9
Và đối với những người thắc mắc, trong VB.NET, bạn có thể sử dụng [ ]để chỉ định một định danh nguyên văn, vd Dim [String] As String.
MicroVirus

74

Nó chỉ cho phép bạn sử dụng một từ dành riêng như một tên biến. Không khuyến nghị IMHO (trừ trường hợp như bạn có).


6
@rslite: +1 Không được đề xuất :)
user7116

4
> không bao giờ +1 Không được đề xuất, nhưng không bao giờ nói không bao giờ. Ví dụ, bạn có thể cần triển khai giao diện COM kế thừa sử dụng từ khóa C # làm định danh. Hoặc Microsoft có thể giới thiệu các từ khóa mới trong các phiên bản mới của Khung - ví dụ như sản lượng trong ứng dụng giao dịch Trái phiếu .NET 1.1 :)
Joe

2
@Joe: yieldTừ khóa mới không phải là một từ dành riêng và chỉ có thể sử dụng được trong các ngữ cảnh mà không có định danh nào có thể xuất hiện hợp pháp . Một mục tiêu khi thiết kế các tính năng mới cho C # là xây dựng chúng theo cách mà bất kỳ chương trình nào là hợp pháp trước khi một tính năng mới được thêm vào sẽ là hợp pháp sau đó và có cùng ý nghĩa .
supercat

6
@Html.TextboxFor( , , , new { @class="my-css-class" } )là một ví dụ điển hình khi bạn không thể thực sự hiểu được nó mà không cần phải viết HTML theo cách thủ công hoặc để javascript thay đổi các thuộc tính ở giai đoạn sau.
Flater

Có một xu hướng mới được thấy trong phần mềm Nguồn mở trong đó tất cả các biến được tiền tố với ký hiệu "@" trong mã C #. Tôi tin rằng điều này có thể là do sự quen thuộc của yêu cầu này trong phần mềm PHP cho các biến. Và rất nhiều hệ thống web Nguồn mở hiện được mã hóa bằng C # (trong đó trước đây nó sẽ là PHP)
Wazed_Coder vào

36

Trong C #, ký tự at (@) được sử dụng để biểu thị nghĩa đen rõ ràng không tuân thủ các quy tắc có liên quan trong thông số ngôn ngữ.

Cụ thể, nó có thể được sử dụng cho các tên biến xung đột với các từ khóa dành riêng (ví dụ: bạn không thể sử dụng params nhưng thay vào đó bạn có thể sử dụng @params, tương tự với out / ref / bất kỳ từ khóa nào khác trong đặc tả ngôn ngữ). Ngoài ra, nó có thể được sử dụng cho các chuỗi ký tự không thoát; điều này đặc biệt phù hợp với các hằng số đường dẫn, ví dụ thay vì path = "c:\\temp\\somefile.txt"bạn có thể viết path = @"c:\temp\somefile.txt". Nó cũng thực sự hữu ích cho các biểu thức thông thường.


Điểm thú vị (và ghi nhớ hữu ích) rằng quy ước là giống nhau giữa "verbatim-" hoặc " here-string " đặt tên tham số.
ruffin

13

Không giống như sigils của Perl, một @tiền tố trước một tên biến trong C # không có nghĩa. Nếu xlà một biến, @xlà một tên khác cho cùng một biến.

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

Nhưng @tiền tố có một cách sử dụng , như bạn đã phát hiện ra - bạn có thể sử dụng nó để làm rõ các tên biến mà C # sẽ từ chối là bất hợp pháp.

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

> string @string;

10

Các @biểu tượng cho phép bạn sử dụng từ khoá dành riêng cho tên biến. như @int, @string, @double, vv

Ví dụ:

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

Đoạn mã trên hoạt động tốt, nhưng bên dưới sẽ không hoạt động:

string public = "This will not compile";

4

Nó chỉ đơn giản cho phép bạn sử dụng các từ dành riêng như tên biến. Tôi muốn một var được gọi là eventngày khác. Tôi sẽ đi với _eventthay vào đó, nhưng đồng nghiệp của tôi nhắc nhở tôi rằng tôi chỉ có thể gọi nó @eventđể thay thế.


3

Một trường hợp sử dụng khác là phương pháp mở rộng. Tham số đặc biệt đầu tiên có thể được phân biệt để biểu thị ý nghĩa thực sự của nó với @thistên. Một ví dụ:

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

Nếu chúng tôi sử dụng một từ khóa làm tên cho một mã định danh, chúng tôi sẽ nhận được một lỗi trình biên dịch Nhận dạng lỗi của trình biên dịch, 'Tên định danh' là một từ khóa, Để khắc phục lỗi này, hãy đặt tiền tố cho mã định danh với mật @ @. Định danh như vậy là định danh nguyên văn. Ký tự @ không thực sự là một phần của mã định danh, do đó, mã định danh có thể được xem trong các ngôn ngữ khác như một mã định danh thông thường, không có tiền tố


1

Bạn có thể sử dụng nó để sử dụng các từ khóa dành riêng như tên biến như

 int @int = 3; 

trình biên dịch sẽ bỏ qua @và biên dịch biến nhưint

nó không phải là một thói quen phổ biến để sử dụng suy nghĩ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.