2009-06-04 11 views
12

वहाँ है कि क्या मैं प्रारंभ की तरह एक पूर्णांक चर पर कोई अंतर है? आईआईआरसी, मुझे लगता है कि वे दोनों एक ही चीज़ के रूप में माना जाता है, लेकिन मुझे लेख नहीं मिल रहा है।सी # चर प्रारंभ प्रश्न

+11

_Fields_ हमेशा स्वचालित रूप से फ़ील्ड प्रकार के डिफ़ॉल्ट मान में प्रारंभ होता है, जो int के मामले में शून्य है। फ़ील्ड निश्चित रूप से असाइन किए जाने के लिए माना जाता है; आप एक स्पष्ट असाइनमेंट से पहले भी अपनी सामग्री पढ़ सकते हैं। _Locals_ निश्चित रूप से असाइन नहीं माना जाता है; आपको ऐसा कुछ करने की आवश्यकता है जो इसकी सामग्री को पढ़ने से पहले स्थानीय के मान को असाइन करे। विवरण के लिए सी # विनिर्देश के "निश्चित असाइनमेंट" खंड देखें। लिंक के लिए –

उत्तर

6

मैंने आईएल (ildasm का उपयोग करके) देखा और यह सच है कि केवल int सेट 0 को वास्तव में कन्स्ट्रक्टर में 0 पर सेट किया गया है।

public class Class1 
{ 
    int setToZero = 0; 
    int notSet; 
} 

उत्पन्न करता है:

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  15 (0xf) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: ldc.i4.0 
    IL_0002: stfld  int32 ClassLibrary1.Class1::setToZero 
    IL_0007: ldarg.0 
    IL_0008: call  instance void [mscorlib]System.Object::.ctor() 
    IL_000d: nop 
    IL_000e: ret 
} // end of method Class1::.ctor 
+0

लेकिन क्या यह संभव नहीं है कि उस वर्ग के लिए ctor उन चर के लिए परिवर्तनीय प्रारंभिक संभालता है जो स्पष्ट रूप से असाइन नहीं किए गए हैं? –

+8

माइकल: _constructor_ द्वारा नहीं, _memory manager_ द्वारा फ़ील्ड को डिफ़ॉल्ट (शून्य) मानों में प्रारंभ किया गया है। –

+0

स्पष्टीकरण के लिए एरिक लिपर्ट के लिए बहुत धन्यवाद। काश मैं इस चर्चा में भाग लेने वाले एक या अधिक व्यक्तियों को क्रेडिट दे सकता था। सामान्य रूप से, मैं हमेशा अधिक ज्ञान के साथ चलता हूं कि मैं यहां आया था;) – coson

1

पर इस लेख का उल्लेख कर सकते नीचे दिए गए लिंक राज्यों के रूप में, वे बिल्कुल एक जैसे हैं:

http://msdn.microsoft.com/en-us/library/aa664742%28VS.71%29.aspx

+0

केवल तभी सही है जब वे फ़ील्ड (कक्षा के सदस्य) हों। ओपी चर का उल्लेख करता है और नाम यह भी सुझाव देता है। –

14

तो चर मैं एक उदाहरण चर रहा है, यह स्वचालित रूप से मान 0 असाइन किया जाना चाहिए। यदि यह किसी विधि में स्थानीय चर है, तो यह अनिर्धारित है, इसलिए इसे उपयोग करने से पहले आपको इसे एक मान असाइन करना होगा।

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     intTest it; 

     it = new intTest(); 

     Console.ReadLine(); 
    } 

    class intTest 
    { 
     int i; 

     public intTest() 
     { 
      int i2; 

      Console.WriteLine("i = " + i); 
      Console.WriteLine("i2 = " + i2); 
     } 
    } 
} 

ऊपर संकलन नहीं करेगा क्योंकि i2 निरस्त किया गया। हालांकि,

int i2 = 0; 

i2 0 बताए, यानी और संकलन, तो चलाकर, दिखा देंगे कि दोनों अब आवंटित कर रहे हैं 0.

+0

int एक संरचना नहीं है एक वर्ग है। structs का डिफ़ॉल्ट मान होता है जबकि कक्षाएं डिफ़ॉल्ट रूप से शून्य होती हैं। –

+0

@ मैथ्यू व्हिटेड, उनका मतलब यह नहीं था कि यह एक वर्ग था। वह कक्षा "स्तर" में कह रहा था, जिसका अर्थ वास्तव में आवृत्ति चर है। मैंने इसे स्पष्टीकरण के लिए संपादित किया। – mmcdole

0

आप सी # में एक प्रकार बनाने के किसी भी समय, यह स्वचालित रूप से भरा हो जाता है गद्दीदार शून्य। एक वर्ग (संदर्भ प्रकार) के मामले में, यह एक शून्य सूचक के बराबर है। इसलिए

MyClass class; 
MyClass class2 = null; 
मूल्य प्रकार (किसी भी struct, सहित पूर्णांक/नाव/डबल/आदि), प्रकार शून्य से पारित हो जाता है के साथ

,: तो, तकनीकी रूप से, किसी भी समय आप वर्गों के साथ काम कर रहे हैं, तो निम्न समान हैं अनुसरण कर रहे हैं बराबर:

int i; 
int j = 0; 

हालांकि, एक विधि में, संकलक जांच करता है कि आप इसे का उपयोग करने से पहले अपने प्रकार के लिए एक मान निर्दिष्ट किया देखने के लिए। आप निम्नलिखित करते हैं, संकलक शिकायत:

int i; 
Console.WriteLine{"{0}",i); 

तकनीकी तौर पर, ऊपर ठीक होना चाहिए - लेकिन जब से यह प्रोग्रामर त्रुटि की एक आम स्रोत है, संकलक विशेष रूप से असाइन नहीं किए गए स्थानीय चर के लिए जाँच करता है, और शिकायत। हालांकि, यह एक संकलित समय शिकायत है, न कि सीएलआर मुद्दा। आप आईएल बना सकते हैं जो ऊपर करता है, और यह ठीक चलता है।

0

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

1

इस बात के साथ, सी # में "डिफ़ॉल्ट" कीवर्ड का उल्लेख करना उचित है।

आईई।

int someValue = collection.<various linq methods>.SingleOrDefault(); 
if (someValue == default(int)) 
{ 
    //Code for the default case 
} 
: int i; int i = default(int); जो int i = 0; और MyClass o = default(MyClass); के बराबर है के बराबर है MyClass o = null;

यह विशेष रूप से प्रासंगिक है जब LINQ तरीकों जैसे .SingleOrDefault() का उपयोग कर, क्योंकि आप हमेशा अपने कोड अधिक पठनीय बनाने के लिए निम्नलिखित का उपयोग कर सकते है के बराबर है

और

MyClass someValue = collection.<various linq methods>.SingleOrDefault(); 
if (someValue == default(MyClass)) 
{ 
    //Code for the default case 
} 
0

विभिन्न यहाँ प्रतिक्रियाओं तरह का भ्रामक हैं, वें सहित ई कोडिंग डरावनी वेबसाइट में संदर्भित लेख।

संकलक जेनरेट कोड को अनुकूलित करने के लिए कॉन्फ़िगर किए जाने पर सभी "अनावश्यक" प्रारंभिकताओं को हटाने के लिए आपके कोड को अनुकूलित करेगा। कृपया ध्यान दें कि "रिलीज" मोड में संकलन करते समय यह डिफ़ॉल्ट व्यवहार है।

मैं, एक के लिए सोचता हूं कि यह आपके सभी चर शुरू करने के लिए हमेशा उपयोगी होता है। डिस्प्ले हिट में प्रदर्शन हिट न्यूनतम और रिलीज मोड में कोई भी नहीं होगा, लेकिन स्पष्ट रूप से चर सेट करने के लाभ भविष्य में कोड को बनाए रखने के लिए जबरदस्त होंगे, बेहतर "कोडिंग कोड कोड" शैली में। मुझे यह मेरा बहुत अनुभवी सहकर्मी याद है, जिसने सोचा था कि इंट 32 का डिफ़ॉल्ट मान Int32 था। 0 के बजाय MinValue। इस तरह के भ्रम हमेशा कोड में निहित चीजों के साथ होता है, और मेरे लिए, उन्हें ज्यादातर मामलों में टालना चाहिए।

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