2010-10-06 17 views
7

मैंने अब तक वास्तव में कभी इस पर सवाल नहीं उठाया है।कक्षा में स्थिर या निरंतर संपत्ति और एक ही नाम की एक इंस्टेंस प्रॉपर्टी क्यों नहीं हो सकती है?

public class SomeGridRow 
{ 
    public string Code { get;set; } 
    public string Description { get;set; } 

    public const string Code = "Code"; 
} 

जाहिर है, इस त्रुटि देता है:: मैं क्षेत्रों की संख्या के साथ एक इनपुट मॉडल मिल गया है, मैं इनपुट मॉडल के माध्यम से संपत्तियों की स्ट्रिंग नाम पेश करने के लिए इतना है कि मेरी ग्रिड उनका उपयोग कर सकते चाहता था

The type 'SomeGridRow' already contains a definition for 'Code'

सीएलआर एक ही नाम के दो गुणों का सामना क्यों नहीं कर सकता है, जो मेरी आंखों में अलग हैं?

string code = gridRow.Code;   // Actual member from instantiated class 
string codeField = SomeGridRow.Code; // Static/Const 

मैं अब सिर्फ एक बच्चे वर्ग अब मेरी जानकारी के भीतर Fields कहा जाता है का उपयोग कर रहा है, इसलिए मैं SomeGridRow.Fields.Code उपयोग कर सकते हैं। यह थोड़ा गन्दा है, लेकिन यह काम करता है।

उत्तर

7

क्योंकि आप भी स्थिर (या इस मामले में, गैर उदाहरण) गुण उसी तरह से उपयोग कर सकते हैं (एक ही कक्षा के अंदर), और यह उदाहरण के लिए एक सा भ्रामक हो सकता है,:

public class SomeGridRow 
{ 
    public string Code { get;set; } 
    public const string Code = "Code"; 
    public void MyMethod() { 
    var thing = Code; //what would this reference? 
    } 
} 

क्योंकि दोनों इस:

public class SomeGridRow 
{ 
    public string Code { get;set; } 
    public void MyMethod() { 
    var thing = Code; //what would this reference? 
    } 
} 

और यह:

public class SomeGridRow 
{ 
    public const string Code = "Code"; 
    public void MyMethod() { 
    var thing = Code; //what would this reference? 
    } 
} 

गुण का उपयोग करने के वैध तरीके, सेंट हैं परमाणु या नहीं। यह जवाब नहीं देता "मैं क्यों नहीं कर सकता?" सवाल है, लेकिन इसकी अनुमति क्यों नहीं है ... यह बहुत ही अस्पष्ट आईएमओ होगा।

+0

ऐ, मैं सुपर जब यह वर्तनी हो तो यह स्पष्ट हो जाता है। मैंने हमेशा अपने वास्तविक वर्ग नाम का उपयोग करके पहुंच के रूप में स्थिर सदस्यों को लिया। कोडिंग मानकों का हिस्सा मैं काम करता हूं। – GenericTypeTea

+1

@GenericTypeTea - और यह एक उत्कृष्ट मानक है, कक्षा के अंदर जहां यह सबसे अस्पष्ट है, मुझे शायद इस तरह से अनुमति नहीं दी जानी चाहिए ... लेकिन मुझे लगता है कि जिस तरह से यह समाप्त हुआ वह शायद कम से कम भ्रमित समझौता है। –

+0

मैं सहमत हूं। यह एक आकार का एक और मामला है जो फिट नहीं है ... यह वास्तव में एक बड़ा मुद्दा नहीं है। मैं सिर्फ picky जा रहा हूँ। मैं सिर्फ नेस्टेड कक्षाओं से घृणा करता हूं। – GenericTypeTea

3

शायद यह हो सकता है, लेकिन सी # के डिजाइनर अस्पष्टताओं से बचना चाहते थे जो भाषा सुविधाओं के इस तरह के उपयोग (दुर्व्यवहार?) से आ सकते हैं।

इस तरह के कोड उपयोगकर्ताओं को भ्रमित और संदिग्ध होने लगेंगे (क्या मुझे उदाहरण या स्थैतिक विधि कॉल चाहिए ?, कौन सा सही है?)।

+0

मानकों का मैं हमेशा यह मानता हूं कि स्थिर सदस्यों को उनके स्थिर नाम से संदर्भित किया जाना चाहिए Ie 'Foo' हमेशा' TheStaticClass.Foo 'होगा। इसलिए अस्पष्टता कोई मुद्दा नहीं है जो मुझे प्रभावित करेगा। यह वास्तव में शर्म की बात है! मुझे नेस्टेड कक्षाओं की जगह संभावित (लेकिन नियंत्रित) अस्पष्टता होगी। – GenericTypeTea

+0

@GenericTypeTea - अगर केवल एमएस ने आपके लिए सी # लिखा है और केवल आप;) – Oded

+0

ठीक है, उन्हें चाहिए। विजुअल स्टूडियो 2010 जेनेरिक टाइप टाइप संस्करण! मैं इसे खरीदूंगा :) – GenericTypeTea

1

अस्पष्टता के बारे में पहले से किए गए बिंदुओं के अतिरिक्त, मैं कहूंगा कि इस तरह के मामले में नामकरण को फिर से देखा जाना चाहिए।

यदि दो चर/फ़ील्ड समान संदर्भ में समान नाम रखते हैं i.e वर्ग लेकिन मेरे लिए अलग-अलग मान एक नामकरण समस्या की तरह लगता है।

यदि वे बिल्कुल समान हैं, तो आपको 2 फ़ील्ड की आवश्यकता नहीं है।

यदि वे थोड़ा अलग हैं, तो आपके पास अधिक सटीक नाम होना चाहिए।

+0

instantiatedClass.Code == 'वास्तविक मान'। ग्रिड के कॉलम डेटा स्रोत में जाने के लिए TheClass.Code == 'फ़ील्ड का नाम'। मुझे विचारों में बैठे स्ट्रिंग मान पसंद नहीं हैं। लैम्ब्डा अभिव्यक्तियों का उपयोग करने और विधिनाम प्राप्त करने के लिए प्रतिबिंब का उपयोग करने का एकमात्र विकल्प है। – GenericTypeTea

+0

@GenericTypeTea - शायद यह करने का मेरा तरीका है, लेकिन TheClass.Code मेरे लिए TheClass.CodeColumnName के रूप में अधिक सटीक होगा क्योंकि यह कॉलम नाम के लिए खड़ा है और इसे ऑब्जेक्ट.कोड के साथ भ्रमित नहीं किया जाना चाहिए - जो मान के लिए खड़ा है कोड कॉलम में। इस मामले में, मैं इन दोनों चर को पूरी तरह से अलग मानता हूं और इसलिए अलग-अलग नाम हैं। कम से कम मेरे पास, "कोड" होने के कारण उनके नाम दोनों भ्रामक हैं। मुझे डर है कि मुझे नामों के बीच का लिंक नहीं मिलता है और आप अपने लैम्ब्स में उनका उपयोग कैसे करते हैं ... – InSane

0

इसी तरह के वाक्यविन्यास वाले कुछ अन्य भाषाओं में, कोई एक उदाहरण के माध्यम से स्थिर सदस्य तक पहुंच सकता है। तो आप string.Empty और "abc".Empty दोनों तक पहुंच सकते हैं।

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

कम अस्पष्टता की अनुमति देने के लिए एक कठोर नियम पेश करने के बाद, यह इसके लिए एक नए लूसर नियम की अनुमति देने के लिए प्रतिकूल होगा जो अधिक के लिए अनुमति देता है। सोचें कि कितने "मुझे संपत्ति एक्स के साथ this का उपयोग क्यों करना चाहिए, लेकिन संपत्ति वाई नहीं है?"प्रश्नों को अगर यह अनुमति दी गई थी (हमें this को संपत्ति एक्स के साथ स्पष्ट करना होगा, हम स्पष्ट सदस्य थे)

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

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