2013-05-04 7 views
7

सी # में, मैं "स्मार्ट" enums बनाना चाहता हूं, जावा में तरह की तरह संभव है, जहां केवल अंतर्निहित int की तुलना में एनम मान से जुड़ी अधिक जानकारी है। मैं निम्नलिखित सरल उदाहरण के रूप में, (एक enum के बजाय) एक वर्ग बनाने की एक योजना पर हुआ:सी # उत्परिवर्तन - वीएस कोड विश्लेषण मुझे CA2104 दे रहा है? लगता है ... गरीब। क्या मैं गलतफहमी कर रहा हूं?

public sealed class C 
{ 
    public static readonly C C1 = new C(0, 1); 
    public static readonly C C2 = new C(2, 3); 

    private readonly int x; 
    private readonly int y; 

    private C(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public int X 
    { 
     get 
     { 
      return this.x; 
     } 
    } 

    public int Y 
    { 
     get 
     { 
      return this.y; 
     } 
    } 
} 

लेकिन जब मैं उस पर दृश्य स्टूडियो के "कोड विश्लेषक" चलाने के लिए, यह देता है मुझे C2104 चेतावनी, " केवल म्यूटेबल संदर्भ प्रकारों को पढ़ने की घोषणा न करें "।

मुझे लगता है कि आप आम तौर पर केवल म्यूटेबल संदर्भ प्रकारों को पढ़ने की घोषणा नहीं करना चाहते हैं, लेकिन ... मेरी कक्षा उत्परिवर्तनीय नहीं है, है ना?

चेतावनी के लिए दस्तावेज़ों को पढ़ना, ऐसा लगता है जैसे वे मानते हैं कि कोई भी पढ़ा गया केवल संदर्भ प्रकार उत्परिवर्तनीय है। उदाहरण के लिए, यह कहता है कि यदि वास्तव में प्रकार अपरिवर्तनीय है, तो इस चेतावनी को दबाने के लिए स्वतंत्र महसूस करें।

public sealed class C 
{ 
    public static readonly C C1 = new C(); 
    public static readonly C C2 = new C(); 

    private C() 
    { 
    } 
} 

तो, ठीक है, जब तक कि मैं गंभीरता से अस्थिरता गलत समझ रहा हूँ, CA2104 यह नहीं समझती: और वास्तव में यह मेरा पीछा भी सरल वर्ग के लिए एक ही चेतावनी देता है। और यह मेरी सिफारिश है कि प्रत्येक पंक्ति के लिए चेतावनी को दबाने के लिए जहां तक ​​यह आता है, जब तक मुझे यकीन है कि कक्षा वास्तव में अपरिवर्तनीय है। लेकिन:

(1) तो जब तक कि मैं पूरी तरह से इस चेक को बंद नहीं कर देता, मुझे इसे हर बार दबाया जाना चाहिए जब तक कि मैं कभी भी एक अपरिवर्तनीय पठन सदस्य का उपयोग नहीं करता, जिसे मैं किसी भी दिए गए गणना के लिए कई बार कर सकता हूं?

(2) लेकिन बदतर है, भले ही मुझे लगता है कि, तो किसी को बाद में गलती से अस्थिरता लागू कर सकते हैं, लेकिन किसी और अभी भी इस तथ्य के द्वारा दिए गए सुरक्षा की झूठी भावना होगा कि किसी को मैन्युअल रूप से वहाँ दमन कर दिया कह कर "मैं जाँच और यह अपरिवर्तनीय है "?

+0

मैं एक ऐसी ही प्रश्न था: http://stackoverflow.com/questions/15740025/the-ca2104-warning-is-there-any-way-to-mark-a-class-as-immutable- –

उत्तर

5

आप सही हैं - यह इस परिदृश्य में एक झूठा सकारात्मक है। आपके एकमात्र विकल्प अलग-अलग दबाने या चेतावनी को बंद करना है, और डाउनसाइड्स ठीक उसी प्रकार हैं जैसा आपने प्रत्येक विकल्प के लिए वर्णित किया है।

अन्य विकल्प इस चेतावनी से बचने के लिए शामिल हैं:

  • स्थिर क्षेत्रों का प्रयोग न करें। इसके बजाए, आप सार्वजनिक संपत्ति और निजी सेट के साथ स्थिर संपत्ति का उपयोग कर सकते हैं, और इनलाइन के बजाय कन्स्ट्रक्टर में प्रारंभ कर सकते हैं।

  • इन अपरिवर्तनीय मूल्य प्रकार बनाएं, जो चेतावनी को बाधित करेंगे, लेकिन संभावित रूप से कुछ परिदृश्यों में अलग-अलग व्यवहार देते हैं। यह आपके मामले में एक विकल्प हो सकता है या नहीं भी हो सकता है।

+0

को दबाने के लिए इसे एक मूल्य प्रकार में बदलना काम किया - धन्यवाद! मुझे लगता है कि मैं इसका उपयोग कैसे करना चाहता हूं, इसके लिए ठीक होना चाहिए, इसलिए मैं इसे इस तरह से करना शुरू कर दूंगा और जब मैं उन्हें सामना कर सकता हूं तो किसी अन्य मुद्दे से निपटना होगा। एक बार फिर धन्यवाद! – user2350774

+0

@ user2350774 गुणों का उपयोग वास्तव में मेरी वरीयता है। सार्वजनिक क्षेत्रों कई नुकसान (आप कारणों की टन के लिए यहां पर खोज क्यों सार्वजनिक एपीआई में खेतों से बचने के लिए कर सकते हैं) है –

+0

सुनिश्चित नहीं हैं कि मैं समझता हूँ कि - मैंने किया था एक्स और वाई या के लिए उपयोग गुण आप सुझाव दे रहे हैं कि मैं भी गुण का उपयोग करना चाहिए उन स्थिर चीजों के लिए जिन्हें मैं इलाज करना चाहता हूं, अनिवार्य रूप से, enum मूल्यों के रूप में? – user2350774

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