2008-09-18 9 views
252

मुझे पता चला कि आप अपना परिवर्तनीय नाम सी # में '@' चरित्र के साथ शुरू कर सकते हैं। मेरे सी # प्रोजेक्ट में मैं एक वेब सेवा का उपयोग कर रहा था (मैंने अपनी परियोजना में एक वेब संदर्भ जोड़ा) जो जावा में लिखा गया था। डब्लूएसडीएल में परिभाषित इंटरफ़ेस ऑब्जेक्ट्स में से एक सदस्य चरम नाम "पैराम्स" था। जाहिर है यह सी # में एक आरक्षित शब्द है, इसलिए आपके पास सदस्य "चरम" नाम के साथ सदस्य चर के साथ कक्षा नहीं हो सकती है।सी # में परिवर्तनीय नामों में @ वर्ण का उपयोग/अर्थ क्या है?

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

मैं 2008 वी.एस. C# प्रलेखन के माध्यम से खोज की, लेकिन इसके बारे में कुछ भी नहीं मिला: प्रॉक्सी वस्तु उत्पन्न हुए उस एक संपत्ति है कि इस तरह देखा निहित। Google को भी खोजने से मुझे कोई उपयोगी जवाब नहीं मिला। तो परिवर्तनीय/संपत्ति नाम में '@' वर्ण का सटीक अर्थ या उपयोग क्या है?

उत्तर

266

C# Language Specification से सीधे, § 2.4.2 Identifiers (C#) :

उपसर्ग "@" पहचानकर्ता के रूप में खोजशब्दों का उपयोग, जो उपयोगी होता है जब अन्य प्रोग्रामिंग भाषाओं के साथ इंटरफ़ेस सक्षम बनाता है। चरित्र @ वास्तव में पहचानकर्ता का हिस्सा नहीं है, इसलिए पहचानकर्ता अन्य भाषाओं में सामान्य पहचानकर्ता के रूप में उपसर्ग के बिना देखा जा सकता है। एक @@ उपसर्ग के साथ पहचानकर्ता को एक क्रियात्मक पहचानकर्ता कहा जाता है।

+2

.NET समर्थन '@' का लक्षित न्यूनतम संस्करण क्या है? – serhio

+13

.NET स्वयं इस तरह के '@' प्रतीक को परिभाषित नहीं करता है, सी # भाषा विनिर्देश करता है। इसने अपने पहले संस्करण, सी # 1.0 (.NET 1.0 के साथ जारी) के बाद इसका समर्थन किया है। http://csharpindepth.com/articles/chapter1/Specifications.aspx –

+5

और उन लोगों के लिए, जो VB.NET में सोचते हैं, आप वर्बैटिम पहचानकर्ता निर्दिष्ट करने के लिए '[]' का उपयोग कर सकते हैं। 'मंद [स्ट्रिंग] स्ट्रिंग के रूप में '। – MicroVirus

60

यह आपको एक आरक्षित शब्द को चर नाम के रूप में उपयोग करने देता है। अनुशंसित IMHO (आपके जैसे मामलों को छोड़कर)।

+5

@rslite: +1 नहीं अनुशंसित :) – user7116

+2

+1 +1। कभी ऐसा नहीं करेंगे। –

+4

> * कभी नहीं * +1 अनुशंसित नहीं है, लेकिन कभी भी कभी नहीं कहें। उदाहरण के लिए आप एक विरासत COM इंटरफ़ेस को लागू करने की आवश्यकता हो सकती है जो एक पहचानकर्ता के रूप में सी # कीवर्ड का उपयोग करती है। या माइक्रोसॉफ्ट फ्रेमवर्क के नए संस्करणों में नए कीवर्ड पेश कर सकता है - उदा। एक .NET 1.1 बॉन्ड ट्रेडिंग ऐप में उपज :) – Joe

4

यह आपको आरक्षित शब्दों को परिवर्तनीय नामों के रूप में उपयोग करने की अनुमति देता है। मैं दूसरे दिन event नामक एक var चाहता था। मैं इसके बजाय _event के साथ जाने जा रहा था, लेकिन मेरे सहयोगी ने मुझे याद दिलाया कि मैं इसे @event कह सकता हूं।

29

सी # पर (@) वर्ण में उन अक्षरों को दर्शाने के लिए उपयोग किया जाता है जो स्पष्ट रूप से भाषा के विशिष्ट नियमों का पालन नहीं करते हैं।

विशेष रूप से, इसका उपयोग उन चरम नामों के लिए किया जा सकता है जो आरक्षित कीवर्ड के साथ संघर्ष करते हैं (उदाहरण के लिए आप पैराम का उपयोग नहीं कर सकते हैं, लेकिन आप भाषा विनिर्देश में आउट/रेफ/किसी अन्य कीवर्ड के साथ @params का उपयोग कर सकते हैं)। इसके अतिरिक्त यह अनचाहे स्ट्रिंग अक्षर के लिए उपयोग किया जा सकता है; यह विशेष रूप से पथ स्थिरांक के साथ प्रासंगिक है, उदा। path = "c:\\temp\\somefile.txt" के बजाय आप path = @"c:\temp\somefile.txt" लिख सकते हैं। यह नियमित अभिव्यक्तियों के लिए भी वास्तव में उपयोगी है।

+0

यह वास्तव में मेरे लिए उपयोगी है, धन्यवाद :) –

1

अगर हम एक पहचानकर्ता के लिए नाम के रूप में एक कीवर्ड का उपयोग हम एक संकलक त्रुटि मिलती है इस त्रुटि को दूर करने, साथ पहचानकर्ता उपसर्ग "पहचानकर्ता की उम्मीद, 'पहचानकर्ता नाम' एक कीवर्ड" "@"। ऐसे पहचानकर्ता शब्दशः पहचानकर्ता हैं। चरित्र @ वास्तव में पहचानकर्ता का हिस्सा नहीं है, इसलिए पहचानकर्ता एक सामान्य पहचानकर्ता के रूप में अन्य भाषाओं में देखा जा सकता है, उपसर्ग

11

पर्ल के sigils के विपरीत, सी # में एक चर नाम से पहले एक @ उपसर्ग कोई अर्थ नहीं है बिना। यदि x एक चर है, @x एक ही चर के लिए एक और नाम है।

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

लेकिन @ उपसर्ग के रूप में आप की खोज की है, एक उपयोग है - आप चर नाम हैं जो सी # अन्यथा के रूप में अवैध अस्वीकार होगा स्पष्ट करने के लिए उपयोग कर सकते हैं।

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

> string @string; 
2

एक अन्य उपयोग-केस विस्तार विधियों में है। पहला, विशेष पैरामीटर @this नाम के साथ अपने वास्तविक अर्थ को दर्शाने के लिए विशिष्टता प्राप्त किया जा सकता है। एक उदाहरण:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> @this, 
    TKey key, 
    TValue defaultValue) 
    { 
     if ([email protected](key)) 
     { 
      return defaultValue; 
     } 

     return @this[key]; 
    } 
1

आप के रूप int

यह नहीं है एक तरह

int @int = 3; 

चर नाम के रूप में सुरक्षित कीवर्ड्स का उपयोग करने के लिए इसका इस्तेमाल संकलक @ पर ध्यान नहीं देता और चर संकलित कर देगा कर सकते हैं विचार का उपयोग करने के लिए सामान्य अभ्यास

6

@ प्रतीक आपको परिवर्तनीय नाम के लिए आरक्षित कीवर्ड का उपयोग करने की अनुमति देता है। पूर्णांक @int, @string, @double आदि जैसे

उदाहरण के लिए:

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

उपरोक्त कोड ठीक काम करता है, लेकिन नीचे काम नहीं करेगा:

string public = "This will not compile"; 
संबंधित मुद्दे