2011-03-10 13 views
15

मैंक्या सी # आरक्षित शब्दों की पहचान करने के लिए कोई प्रोग्रामेटिक तरीका है? मैं जानता हूँ कि

public bool IsAReservedWord(string TestWord) 

की तरह एक समारोह के लिए देख रहा हूँ मैं MSDN से एक आरक्षित शब्द सूची हथियाने द्वारा अपने ही रोल कर सकते हैं। हालांकि मैं उम्मीद कर रहा था कि भाषा या .NET प्रतिबिंब में कुछ बनाया गया था जिस पर भरोसा किया जा सकता था इसलिए जब मैं सी #/नेट के नए संस्करणों में जाता हूं तो मुझे फ़ंक्शन पर फिर से जाना नहीं होगा।

कारण मैं इसे ढूंढ रहा हूं, मैं .tt फ़ाइल कोड जनरेशन में एक सुरक्षा की तलाश में हूं।

+3

संदेह है कि देखते हैं। कारणों में से एक हो सकता है - संदर्भ विशिष्ट कीवर्ड हैं। –

+0

... हालांकि यदि आपको संदर्भ के बारे में परवाह नहीं है, चाहे कोई स्ट्रिंग एक कीवर्ड है, तो यह एक बहुत ही सरल परीक्षण है। मुझे संदेह है कि इस तरह के परीक्षण को बनाए रखने का प्रयास मामूली से परे कुछ भी है। यहां तक ​​कि एमएस बहुत तेजी से सी # के संस्करणों का निर्माण नहीं कर सकता है। –

उत्तर

24
CSharpCodeProvider cs = new CSharpCodeProvider(); 
var test = cs.IsValidIdentifier("new"); // returns false 
var test2 = cs.IsValidIdentifier("new1"); // returns true 
+1

ध्यान दें कि यह गलती से पहचानकर्ता बनाने के खिलाफ आपकी रक्षा नहीं करेगा जो दो अंडरस्कोर से शुरू होता है। ऐसा करने से बचने के लिए सुनिश्चित करें। – Brian

+0

@ ब्रायन मैंने इसे सी # एप्लिकेशन लक्ष्यीकरण में सत्यापित किया। नेट 4. 'IsValidIdentifier' एपीआई झूठी वापसी करने में सक्षम है जब मैं एक आरक्षित कीवर्ड के लिए निम्नलिखित जांच करता हूं जो दो अंडरस्कोर 'var test3 = cs.IsValidIdentifier (" __ arglist ") से शुरू होता है। ; // झूठी वापसी '। तो मेरा मानना ​​है कि इस एपीआई को उस अर्थ में पूर्ण प्रमाण होना चाहिए। – RBT

+0

@ आरबीटी: डबल अंडरस्कोर उपसर्ग आंतरिक उपयोग के लिए आरक्षित हैं और इस प्रकार कभी भी इसका उपयोग नहीं किया जाना चाहिए। माइक्रोसॉफ्ट हमेशा डबल अंडरस्कोर कीवर्ड भी दस्तावेज नहीं करता है। मैं यह भी ध्यान रखूंगा कि प्रासंगिक कीवर्ड तकनीकी रूप से मान्य पहचानकर्ता हैं (और इस प्रकार 'IsValidIdentifier' उन्हें ठीक के रूप में चिह्नित करता है), लेकिन उनका उपयोग करके परेशानी के लिए भीख मांगना है। उदाहरण के लिए, आपको शायद 'उपज' का उपयोग वैरिएबल नाम के रूप में नहीं करना चाहिए। प्रासंगिक कीवर्ड को अवरुद्ध करने में विफल होने पर शायद संदिग्ध कोड उत्पन्न करने के तरीके हैं। – Brian

3
static System.CodeDom.Compiler.CodeDomProvider CSprovider = 
      Microsoft.CSharp.CSharpCodeProvider.CreateProvider("C#"); 

    public static string QuoteName(string name) 
    { 
     return CSprovider.CreateEscapedIdentifier(name); 
    } 

    public static bool IsAReservedWord(string TestWord) 
    { 
     return QuoteName(TestWord) != TestWord; 
    } 

के बाद से CreateEscapedIdentifier की परिभाषा है:

public string CreateEscapedIdentifier(string name) 
{ 
    if (!IsKeyword(name) && !IsPrefixTwoUnderscore(name)) 
    { 
     return name; 
    } 
    return ("@" + name); 
} 

यह ठीक से __ पहचानकर्ता की पहचान करेगा के रूप में सुरक्षित।

+0

यह काम नहीं करता है - 'CreateEscapedIdentifier' दो प्रमुख अंडरस्कोर के साथ स्ट्रिंग से बच नहीं पाएगा। –

+0

@ ओन्ड्रेज: दो अग्रणी अंडरस्कोर के साथ स्ट्रिंग आरक्षित हैं, इसलिए मुझे लगता है कि यह पूरी तरह से मान्य है। – Gabe

+0

@Gabe: निर्भर करता है कि आप कार्यान्वयन के साथ संघर्ष को रोकने के लिए उनसे बचना चाहते हैं या नहीं। ".tt फ़ाइल कोड जनरेटिंग में एक सुरक्षा की तलाश में" संतुष्ट करने के लिए मेरे दृष्टिकोण से "' CreateEscapedIdentifier' पर्याप्त मजबूत नहीं है। –

11

Microsoft.CSharp.CSharpCodeGenerator में IsKeyword(string) विधि है जो ठीक है। हालांकि, कक्षा आंतरिक है, इसलिए आपको इसका उपयोग करने के लिए प्रतिबिंब का उपयोग करना होगा और इसकी कोई गारंटी नहीं है कि यह .NET ढांचे के भविष्य के संस्करणों में उपलब्ध होगा। कृपया ध्यान दें कि IsKeyword सी # के विभिन्न संस्करणों का ख्याल नहीं रखता है।

सार्वजनिक विधि System.CodeDom.Compiler.ICodeGenerator.IsValidIdentifier(string) कीवर्ड को भी अस्वीकार करता है। दोष यह है कि यह विधि कुछ अन्य मान्यताओं को भी करती है, इसलिए अन्य गैर-कीवर्ड स्ट्रिंग भी अस्वीकार कर दी जाती हैं।

अद्यतन: तुम सिर्फ यदि किसी विशेष स्ट्रिंग एक कीवर्ड है फैसला एक वैध पहचानकर्ता उत्पादन के बजाय करने की जरूरत है, तो आप उपयोग कर सकते हैं ICodeGenerator.CreateValidIdentifier(string)यह विधि दो अग्रणी अंडरस्कोर के साथ तारों का ख्याल रखती है और उन्हें एक और अंडरस्कोर के साथ उपसर्ग करके रखती है। कीवर्ड के लिए वही है। ध्यान दें कि ICodeGenerator.CreateEscapedIdentifier(string)@ साइन के साथ इस तरह के स्ट्रिंग उपसर्ग।

दो प्रमुख अंडरस्कोर के साथ पहचानकर्ता शुरूआत कार्यान्वयन के लिए आरक्षित हैं (यानी सी # कंपाइलर और संबंधित कोड जेनरेटर इत्यादि), इसलिए आपके कोड से ऐसे पहचानकर्ताओं से परहेज करना आम तौर पर एक अच्छा विचार है।

अद्यतन 2: कारण ICodeGenerator.CreateEscapedIdentifier से अधिक ICodeGenerator.CreateValidIdentifier को पसंद करते हैं कि __x और @__x मूलतः एक ही पहचानकर्ता हो रहा है। निम्नलिखित संकलन नहीं:

int __x = 10; 
int @__x = 20; 

मामले में संकलक उत्पन्न होगा और एक __x पहचानकर्ता का उपयोग, और उपयोगकर्ता CreateEscapedIdentifier के लिए एक कॉल करने के लिए एक परिणाम के रूप @__x का प्रयोग करेंगे, एक संकलन त्रुटि घटित होता। CreateValidIdentifier का उपयोग करते समय इस स्थिति को रोका जाता है, क्योंकि कस्टम पहचानकर्ता ___x (तीन अंडरस्कोर) में बदल जाता है।

+0

वास्तव में बहुत अच्छी खोज। क्या आप कृपया मुझे एक उदाहरण के साथ मदद कर सकते हैं जो मुझे इस कथन को समझने में मदद कर सकता है 'दोष यह है कि यह विधि कुछ अन्य सत्यापन भी करती है, इसलिए अन्य गैर-कीवर्ड स्ट्रिंग भी खारिज कर दी गई हैं।' क्या आपने कभी ऐसी गैर-कीवर्ड स्ट्रिंग में आ गया है जिसे इस एपीआई ने खारिज कर दिया था? उनमें से किसी एक को जानना वाकई दिलचस्प होगा। – RBT

7

हालांकि मुझे उम्मीद थी वहाँ भी भाषा या नेट प्रतिबिंब है कि पर तो मैं जब मैं के सी #/नए संस्करण के लिए ले जाने के समारोह फिर से नहीं होगा भरोसा किया जा सकता में निर्मित कुछ था। नेट।

ध्यान दें कि सी # कभी नहीं जोड़ा गया है एक नया सुरक्षित कीवर्ड v1.0 के बाद से। प्रत्येक नया कीवर्ड एक अनारक्षित प्रासंगिक कीवर्ड रहा है।

हालांकि यह संभव है कि हम भविष्य में एक नया आरक्षित कीवर्ड जोड़ सकें, हमने ऐसा करने से बचने के लिए कड़ी मेहनत की है।

सभी सुरक्षित और प्रासंगिक कीवर्ड की सूची के लिए अधिकतम 5 सी #,

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

संबंधित मुद्दे