การใช้ / ความหมายของอักขระ @ ในชื่อตัวแปรใน 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 # ภาษาข้อมูลจำเพาะ , Identifiers (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 ไม่แนะนำ :)
user7116

4
> ไม่ +1 ไม่แนะนำ แต่ไม่พูดไม่เคย ตัวอย่างเช่นคุณอาจจำเป็นต้องใช้อินเทอร์เฟซ COM แบบเก่าที่ใช้คำสำคัญ C # เป็นตัวระบุ หรือ Microsoft อาจแนะนำคำหลักใหม่ในรุ่นใหม่ของกรอบ - เช่นอัตราผลตอบแทนในพันธบัตร .NET 1.1 แอปซื้อขาย :)
โจ

2
@ Joe: ใหม่yieldคำหลักไม่ได้เป็นคำสงวนและเป็นเพียงสามารถใช้งานได้ในบริบทที่ระบุไม่ถูกต้องตามกฎหมายก็จะปรากฏขึ้น เป้าหมายหนึ่งเมื่อมีการออกแบบคุณสมบัติใหม่สำหรับ C # คือการสร้างพวกเขาในลักษณะที่ว่าโปรแกรมใด ๆ ซึ่งจะเป็นกฎหมายก่อนที่จะเป็นคุณลักษณะใหม่ที่ถูกเพิ่มเข้ามาจะถูกต้องตามกฎหมายหลังจากนั้นและมีความหมายเดียวกัน
supercat

6
@Html.TextboxFor( , , , new { @class="my-css-class" } )เป็นตัวอย่างที่ดีที่คุณไม่สามารถหลีกเลี่ยงได้โดยไม่ต้องเขียน HTML ด้วยตนเองหรือให้ javascript เปลี่ยนคุณสมบัติในภายหลัง
Flater

มีแนวโน้มใหม่ที่เห็นในซอฟต์แวร์โอเพนซอร์ซซึ่งตัวแปรทั้งหมดจะนำหน้าด้วยสัญลักษณ์ "@" ในรหัส C # ฉันเชื่อว่าอาจเป็นเพราะความคุ้นเคยของข้อกำหนดในซอฟต์แวร์ PHP สำหรับตัวแปรนี้ และระบบเว็บโอเพ่นซอร์สจำนวนมากถูกเข้ารหัสใน C # (ซึ่งในอดีตมันจะเป็น PHP)
Wasted_Coder

36

ใน C # มีการใช้อักขระ at (@) เพื่อแสดงถึงตัวอักษรที่ชัดเจนไม่ปฏิบัติตามกฎที่เกี่ยวข้องในข้อมูลจำเพาะภาษา

โดยเฉพาะสามารถใช้กับชื่อตัวแปรที่ขัดแย้งกับคำหลักที่สงวนไว้ (เช่นคุณไม่สามารถใช้ params แต่คุณสามารถใช้ @params แทนเช่นเดียวกับ out / ref / คำหลักอื่น ๆ ในข้อกำหนดภาษา) นอกจากนี้ยังสามารถใช้สำหรับตัวอักษรสตริงที่ไม่ใช้ค่า Escape; สิ่งนี้เกี่ยวข้องอย่างยิ่งกับค่าคงที่ของเส้นทางเช่นpath = "c:\\temp\\somefile.txt"คุณสามารถเขียนpath = @"c:\temp\somefile.txt"แทนได้ นอกจากนี้ยังมีประโยชน์มากสำหรับการแสดงผลปกติ


จุดที่น่าสนใจ (และตัวช่วยจำที่มีประโยชน์) ที่การประชุมเหมือนกันระหว่าง "verbatim-" หรือ " here-strings " และการตั้งชื่อพารามิเตอร์
ruffin

13

ซึ่งแตกต่างจาก sigils ของ 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

มันช่วยให้คุณสามารถใช้คำสงวนเป็นชื่อตัวแปร ฉันต้องการ var ที่เรียกว่าeventวันก่อน ฉันจะไปด้วย_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.