c# - अंडरस्कोर वाले इस नाम को CLS कंप्लेंट क्यों नहीं है?




.net cls-compliant (6)

मुझे कंपाइलर चेतावनी क्यों मिलती है

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

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

public abstract class DomainObjectBase
{
    protected bool _isNew;
}

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

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

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; }
}

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

Microsoft StyleCop आपके कोड का विश्लेषण करेगा, और यह बताते हुए कि यह CLS अनुरूप नहीं है, यह बताते हुए पुनरावृत्ति करने वाले दस्तावेज़ों को लिंक प्रदान करेगा।


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


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


आम भाषा विशिष्टता से :

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

यदि आप इसे देखते हैं :

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

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


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

आपको यह कंपाइलर त्रुटि मिल रही है, क्योंकि कहीं न कहीं आपके कोड में आपने अपनी असेंबली को सीएलएस के रूप में लेबल किया है जो इस तरह से एक पंक्ति के साथ है:

[assembly: CLSCompliant(true)]

विज़ुअल स्टूडियो में असेंबलीइन्फो.एक्स फ़ाइल में यह लाइन शामिल है, जो अधिकांश प्रोजेक्ट्स में प्रॉपर्टीज़ के तहत मिल सकती है।

इस त्रुटि के आसपास पाने के लिए आप या तो:

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

    protected bool isNew;
  2. अपने पूरे असेंबली को गैर सीएलएस अनुपालन के लिए सेट करें:

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

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

    private bool _isNew;




cls-compliant