2009-07-28 13 views
52

मैं संकलक चेतावनी क्यों मिलता हैयह नाम अंडरस्कोर के साथ क्यों सीएलएस अनुपालन नहीं है?

पहचानकर्ता 'Logic.DomainObjectBase._isNew' है नहीं सीएलएस अनुरूप

निम्न कोड के लिए?

public abstract class DomainObjectBase 
{ 
    protected bool _isNew; 
} 
+23

आप शायद अंकन नहीं किया जाना चाहिए गैर-निजी एक अंडरस्कोर से वैसे भी सदस्य हैं। मुझे पता है कि हर किसी की अपनी शैली है, लेकिन अन्य लगभग निश्चित रूप से सोचेंगे कि यह क्षेत्र सम्मेलन से बाहर है। –

+0

@EdS। कौन सा सम्मेलन? – Pharap

+0

एक बार में एक वीबी सम्मेलन होने लगता है, यह सी ++, सी # के लिए स्टाइल से बाहर भी प्रतीत होता है, यहां पाए गए इस बॉक्स में फिट होने से अधिक विवरण: https://stackoverflow.com/questions/3136594/naming- सम्मेलन-अंडरस्कोर-इन-सीसी-वेरिएबल्स – MatthewMartin

उत्तर

77
से

Common Language Specification:

सीएलएस अनुरूप भाषा संकलनकर्ता की तकनीकी यूनिकोड स्टैंडर्ड 3.0 की रिपोर्ट 15 है, जो अक्षर हैं जो शुरू कर सकते हैं और पहचानकर्ता में शामिल किया जा के सेट को नियंत्रित करता है अनुलग्नक 7 के नियमों का पालन करना होगा । यह मानक यूनिकोड कंसोर्टियम की वेबसाइट से उपलब्ध है।

आप look this up हैं:

है यही कारण है, एक पहचानकर्ता का पहला वर्ण एक अपरकेस अक्षर, छोटा अक्षर, titlecase पत्र, संशोधक पत्र, अन्य पत्र, या पत्र संख्या हो सकती है। पहचानकर्ता के बाद के वर्ण उनमें से कोई भी हो सकते हैं, साथ ही गैर-दूरी वाले अंक, अंक, दशमलव संख्या, कनेक्टर विराम चिह्न, और स्वरूपण कोड (जैसे दाएं-बाएं-चिह्न) को जोड़ना अंतर हो सकता है। आम तौर पर स्वरूपण कोड को पहचानने या तुलना करने से पहले फ़िल्टरिंग कोड फ़िल्टर किए जाने चाहिए।

असल में, आप अंडरस्कोर के साथ पहचानकर्ता शुरू नहीं कर सकते हैं - यह दृश्यमान (सार्वजनिक/संरक्षित) फ़ील्ड पर सीएलएस का अनुपालन करता है।

+0

http://msdn.microsoft.com/en-us/library/k5645wwb(v=VS.100).aspx – JohnB

+1

"अक्षर संख्या" क्या है? – Kevin

+2

@ केविन: उपरोक्त स्निपेट में सभी शर्तें यूनिकोड श्रेणियों को संदर्भित करती हैं: "पत्र, अपरकेस", "पत्र, लोअरकेस", "पत्र, शीर्षक", "पत्र, संशोधक", "पत्र, अन्य" और "संख्या, पत्र"। रोमन अंक 'अक्षर संख्या' का एक उदाहरण हैं। देखें http://www.fileformat.info/info/unicode/category/Nl/list.htm – Joren

28

प्रमुख underscore सहवर्ती _isNew साथ दिखाई देने (जैसे कि, निजी नहीं)।

+12

+1 लेकिन आपको इस तथ्य को शामिल करने की आवश्यकता है कि सदस्य * गैर-निजी * है, जो अग्रणी अंडरस्कोर के साथ सदस्य का नाम सीएलएस-अनुरूप नहीं बनाता है। –

1

यह अंडरस्कोर है। यह article देखें।

0

क्योंकि डेटा सदस्य का नाम, _isNew, अंडरस्कोर के साथ शुरू होता है।

2

एक सीएलएस-अनुरूप पहचानकर्ता अंडरस्कोर से शुरू नहीं होना चाहिए।

7

अंडरस्कोर समस्या का कारण बनता है। सामान्य अभ्यास यह है कि अंडरस्कोर निजी क्षेत्रों के लिए आरक्षित है। संरक्षित/सार्वजनिक सदस्यों को उचित रूप से उद्धृत और नामित किया जाना चाहिए।

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

public abstract class DomainObjectBase{ 
    private bool _isNew; 
    protected bool IsNew { get { return _isNew; } set { _isNew = value;} } 
} 

या, आप 3.x का उपयोग और निजी क्षेत्र से छुटकारा पाने के लिए करना चाहते हैं:

public abstract class DomainObjectBase{ 
    protected bool IsNew { get; set; } 
} 
+0

धन्यवाद! अगर मैं कर सकता तो मैं इसे दूसरा सबसे अच्छा जवाब के रूप में चिह्नित करूंगा। – MatthewMartin

1

अग्रणी _ है गैर सीएलएस अनुरूप

माइक्रोसॉफ्ट StyleCop आपके कोड का विश्लेषण करेगा, और रिलीज दस्तावेजों के लिंक प्रदान करेगा कि यह सीएलएस अनुपालन क्यों नहीं है।

+1

मुझे स्टाइलकॉप का विचार पसंद है, लेकिन इसके नियम FxCop नियमों, Resharper के सुधारक और विजुअल स्टूडियो सुधारक के साथ संघर्ष करते हैं। – MatthewMartin

+0

स्टाइलकॉप और FxCop दोनों माइक्रोसॉफ्ट द्वारा उत्पादित हैं (हालांकि विभिन्न उत्पाद टीमों द्वारा) हालांकि मुझे विश्वास है कि स्टाइलकॉप बाद में है, और इसलिए यदि आप "माइक्रोसॉफ्ट" कोड शैली का उपयोग करना चाहते हैं तो अधिक पसंद किया जाता है। – Frozenskys

38

CLS compliance को अलग-अलग .NET भाषाओं के बीच अंतःक्रियाशीलता के साथ करना है। संपत्ति सीएलएस अनुपालन नहीं है, क्योंकि यह अंडरस्कोर से शुरू होती है और सार्वजनिक है (नोट: सार्वजनिक वर्ग में संरक्षित गुणों को असेंबली के बाहर से एक्सेस किया जा सकता है)।यद्यपि यह काम करेगा यदि संपत्ति सी # से पहुंचा जा सकता है, तो यह अन्य .NET भाषाओं से नहीं पहुंचा जा सकता है जो संपत्ति नामों की शुरुआत में अंडरस्कोर की अनुमति नहीं देते हैं, इसलिए यह सीएलएस-अनुरूप नहीं है।

आप इस संकलक त्रुटि हो रही है क्योंकि कहीं न कहीं अपने कोड में आप अपने विधानसभा सीएलएस शिकायत के रूप में इस तरह की एक पंक्ति कुछ के साथ लेबल है

[assembly: CLSCompliant(true)] 

दृश्य स्टूडियो AssemblyInfo.cs फ़ाइल में इस लाइन में शामिल हैं जो अधिकांश परियोजनाओं में गुणों के तहत पाया जा सकता है।

इस त्रुटि के आसपास पाने के लिए आप कर सकते हैं:

  1. अपनी संपत्ति (अनुशंसित) का नाम बदलें:

    protected bool isNew; 
    
  2. अपने पूरे विधानसभा सेट गैर सीएलएस होने की शिकायत:

    [assembly: CLSCompliant(false)] 
    
  3. अपनी संपत्ति के लिए एक विशेषता जोड़ें:

    [CLSCompliant(false)] 
    protected bool _isNew; 
    
  4. संपत्ति के दायरे को बदलें, ताकि इसे असेंबली के बाहर नहीं देखा जा सके।

    private bool _isNew; 
    
+0

तो, जब आपके पास संरक्षित चर के साथ सार्वजनिक संपत्ति है, तो सबसे अच्छा सम्मेलन क्या है? –

+3

व्यक्तिगत रूप से मैं सभी क्षेत्रों को निजी बनाना चाहता हूं। अगर मुझे दायरे में वृद्धि करने की ज़रूरत है तो मैं इसे संपत्ति प्राप्त/सेट में लपेटूंगा। –

+0

@ मार्टिनब्राउन: ऐसी कई स्थितियां हैं जहां एक वर्ग की सार्वजनिक संपत्ति होगी जिसका सेटटर एक सुरक्षित विधि कहता है जो अद्यतनों को संसाधित करता है, लेकिन जहां व्युत्पन्न प्रकारों को सीधे क्षेत्र का उपयोग करने और बाद में अपडेट पोस्ट करने की वैध आवश्यकता हो सकती है (उदाहरण के लिए यदि कोई वर्ग व्युत्पन्न हो नियंत्रण से उसके रंग और कैप्शन दोनों को बदलने का एक तरीका होता है, लेकिन आधार नहीं है, व्युत्पन्न वर्ग दोनों क्षेत्रों को बदलने के लिए सहायक हो सकता है और फिर एक बार अद्यतन विधि को कॉल कर सकता है)। मेरा झुकाव "विशेषता" और "_characteristic" का उपयोग करना होगा, क्योंकि दोनों VB.NET और C# इसे स्वीकार करते हैं। आप क्या सुझाव देंगे? – supercat

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

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