2009-04-21 14 views
17

वहाँ बनाने संपत्तियों की सी # वाक्यात्मक चीनी रास्ता के बीच कुछ आंतरिक अंतर है:क्या यह सी # में सार्वजनिक चर का उपयोग करना ठीक है अगर यह पढ़ा जाता है?

public string FirstName { get; set; } 

और सिर्फ इस तरह सार्वजनिक चर बनाने: और

public string LastName; 

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

public readonly string InternalCode; 

यह एक सबसे अच्छा अभ्यास तरीका केवल पढ़ने के लिए संपत्ति बनाने के लिए है?

using System; 

namespace TestProps 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Customer customer = new Customer(); 
      customer.FirstName = "Jim"; 
      customer.LastName = "Smith"; 
      customer.Show(); 
     } 
    } 

    class Customer 
    { 
     public string FirstName { get; set; } //prefered 
     public string LastName; //avoid 
     public readonly string InternalCode; //??? 

     public Customer() 
     { 
      InternalCode = "234729834723984"; 
     } 

     public void Show() 
     { 
      Console.WriteLine("{0}, {1} ({2})", LastName, FirstName, InternalCode); 
      Console.ReadLine(); 
     } 
    } 
} 

उत्तर

17

के बाद से वह जवाब नहीं दिया (अभी तक) और कोई और अभी तक इस संदर्भित:

: द्वारा जॉन स्कीट गहराई में संशोधन अपनी पुस्तक सी # (जॉन को आभार प्रकट करते हैं) इस विषय पर एक महान लेख नहीं है

Why Properties Matter

+0

वह आलेख सीधे मेरे प्रश्न को संबोधित करने वाले दो पृष्ठ थे, धन्यवाद! मैं इससे समझता हूं कि जॉन "सार्वजनिक पठनीय बूल इस्वालिद" को भी मंजूरी नहीं देगा; जब तक कि वह अंत में उल्लेख नहीं करता है, यह एक नेस्टेड क्लास –

+1

में है, हम में से उन लोगों के लिए सिर्फ एक उत्तर की तलाश है, एक लंबा लेख नहीं, क्या आप यहां एक स्पूइलर अलर्ट जोड़ सकते हैं और हमें हाँ या कोई जवाब नहीं दे सकते? – DOK

+0

स्कीट आलेख वास्तव में कुछ अपवाद बनाता है, जिनमें से एक इस प्रश्न पर लागू किया जा सकता है। लेख के मुताबिक, "मैं स्थिर पाठक क्षेत्रों जैसे स्ट्रिंग। लक्षण" के लिए एक छोटा अपवाद दूंगा। यह प्रश्न संशोधित किया जा सकता था और उसी लाइन पर कन्स्ट्रक्टर से असाइनमेंट को स्थानांतरित करके सार्वजनिक स्थिर रीडोनली स्ट्रिंग InternalCode = "234729834723984" होगा; इस प्रकार, यह स्कीट वर्णित की तरह एक "स्थिर पाठक क्षेत्र" होगा। – John

1

हां। सार्वजनिक पठनीय चर होना ठीक है (यह केवल इतना है कि उन्हें परिभाषा या कन्स्ट्रक्टर के समय आरंभ किया जा सकता है)।

उदा। Decimal.MaxValue

बैकिंग वैल्यू बदलता है (इसके साथ शुरू होने के अलावा) में सार्वजनिक रीडोनली प्रॉपर्टी अच्छी होती है।

उदा। पर्यावरण। टिककाउंट

मैंने सोचा कि पर्यावरण। न्यूलाइन एक सार्वजनिक रूप से परिवर्तनीय होगा। खैर, यह एक सार्वजनिक संपत्ति है (केवल प्राप्त करें) और विभिन्न प्लेटफॉर्म पर संगतता बनाए रखने का कारण हो सकता है।

+0

इसमें क्या गलत है? डाउन-वोटिंग के कारण कृपया पोस्ट करें। यह मेरी गलती का एहसास करने में मेरी मदद करेगा। धन्यवाद। – shahkalpesh

+0

मुझ से कोई वोट, लेकिन वास्तव में Decimal.MaxValue एक स्थिरांक और नहीं एक उदाहरण क्षेत्र –

3

एक संपत्ति का उपयोग एक इंटरफेस प्रदान करता है जो भविष्य में बदलने के लिए अधिक प्रतिरोधी है। आइए भविष्य में कुछ समय कहें, आंतरिक कोड में उपसर्ग जोड़ने के लिए एक निर्णय लिया गया है।

सार्वजनिक पठनीय चर का उपयोग करके आपकी आंतरिक संरचना का खुलासा होता है और आपको कक्षा के आंतरिक चर का उपयोग करने वाली प्रत्येक पंक्ति में उपसर्ग जोड़ना कठिन होगा।

एक संपत्ति का उपयोग करना, आप बस अनुसरण

public string InternalCode { 
    get { return _prefix + _internalCode; } 
} 

लिख सकते हैं और आप काम हो गया!

+0

(कारणों क्षेत्रों का पर्दाफाश करने के लिए नहीं मेरा उत्तर में जुड़े हुए जॉन स्कीट द्वारा लेख पढ़ें) एक बार आप :-) –

+0

अपने सभी संकलक त्रुटियों का समाधान है क्या कंपाइलर त्रुटियां? –

+0

त्रुटि संशोधक 'केवल पढ़ने के लिए' मान्य नहीं है यह आइटम –

3

मेरी राय में, सार्वजनिक क्षेत्रों का खुलासा करना ठीक है (विशेष रूप से यदि वे केवल पढ़ने या कॉन्स्ट हैं)। ऐसा कहकर, मैं कहूंगा कि उदाहरण में आप पेश कर रहे हैं, मैं शायद गुणों के साथ जाऊंगा क्योंकि वे आपको 2 फायदे (खेतों में) देंगे: 1) बेहतर encapsulation और आप अपने कोड को अनुकूलित करने दे सकते हैं भविष्य और 2) यदि आप डेटा बाध्यकारी कर रहे हैं, तो आपको गुणों की आवश्यकता है।

0

लघु जवाब: सार्वजनिक स्थिरांक ठीक, सार्वजनिक केवल पढ़ने के लिए जरूरी नहीं कि, जरूरी नहीं सेट के बिना सार्वजनिक हो जाता है। ऑब्जेक्ट जिन्हें असाइन किए बिना बदला नहीं जा सकता है ठीक है। संदर्भ प्रकार खतरनाक हैं क्योंकि आप अभी भी अपने मूल्यों को बदल सकते हैं, भले ही आप संदर्भ को स्वयं नहीं बदल सकें।

केवल पढ़ने के लिए कीवर्ड के साथ समस्या यह मतलब नहीं है कि आप क्या समझ चाहते हैं के रूप में तार्किक केवल पढ़ने के लिए/अपरिवर्तनीय है। इसका मतलब है "केवल निर्माता में ही असाइन किया जा सकता है"। संदर्भ बदला नहीं जा सकता है, लेकिन इसके मूल्य हो सकते हैं। दुर्भाग्यवश, सी # द्वारा प्रदान किया गया कोई "असली" रीडोनली कीवर्ड नहीं है। यह भी देखें https://blogs.msdn.microsoft.com/ericlippert/2007/11/13/immutability-in-c-part-one-kinds-of-immutability/

गुणों में केवल पढ़ने योग्य कीवर्ड (https://titombo.wordpress.com/2012/11/11/using-the-c-modifiers/) नहीं हो सकता है। दूसरों के रूप में बताया गया है, यदि आप एक संपत्ति का उपयोग कर सकते हैं और केवल मिलता है और कोई सेट को परिभाषित है, हालांकि आप निर्माता में है कि संपत्ति निर्धारित नहीं कर सकते। एक निजी सेट का उपयोग करना, आप कक्षा में annywhere से गुण सेट, नहीं केवल निर्माता में कर सकते हैं। पठनीय क्षेत्र थोड़ा और अधिक प्रतिबंधक होगा।

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