2015-02-20 4 views
7

यदि यह डिफ़ॉल्ट निर्माता, जो शून्य करने के लिए सदस्य चर तो कैसे यह संभव हो जाएगाडेटा सदस्यों को कौन शुरू करेगा? क्या यह एक कन्स्ट्रक्टर या कोई चीज है?

class A   
{   
    public int i;   
    public int j;   
    public A()   
    {   
     i=12;   
    }   
}   
class Program   
{   
    static void Main(string[] args)   
    {   
     A a = new A();   
     Console.WriteLine(a.i + "" + a.j);   
     Console.ReadLine();   
    }   
} 
+0

जे को उपरोक्त संदर्भ – sathishhanumandla

+0

में शून्य में कैसे शुरू किया जाएगा यदि हमने घोषित डिफ़ॉल्ट कन्स्ट्रक्टर को तब तक निष्पादित किया जाएगा जब हम इसे 'ए = नया ए(); ' – sathishhanumandla

उत्तर

1
डिफ़ॉल्ट रूप से

जवाब इस तथ्य में निहित है कि सी # संख्यात्मक फ़ील्ड हैं 0 को प्रारंभ होगा। सी में रहते हुए ++ पूर्णांक क्षेत्र डिफ़ॉल्ट

+2

घोषित करेंगे कृपया अधिक सटीक रहें और बात करें * मूल्य प्रकार * बनाम * संदर्भ प्रकार * ... –

+0

अच्छा बिंदु :) मैं बाद में संदेश अपडेट करूँगा (वर्तमान में प्रशिक्षण में) – Blaatz0r

19

से कुछ यादृच्छिक मूल्य क्षेत्र initializers कंस्ट्रक्टर्स पहले ही आ जाते क्योंकि है। आप अपने निर्माता में j मूल्य निर्दिष्ट नहीं किया था, यह डिफ़ॉल्ट रूप से 0 हो जाएगा क्योंकि यह एक int है।

10.4.4 Field initialization

एक क्षेत्र का प्रारंभिक मूल्य से, चाहे वह एक स्थिर क्षेत्र या एक उदाहरण क्षेत्र हो, फ़ील्ड के प्रकार का डिफ़ॉल्ट मान (Section 5.2) है।

वह कौन करता है? खैर, newobj जैसा लगता है कि जब आप new पर कॉल करते हैं। अधिक जानकारी के लिए dyatchenkos' answer देखें।

+2

@Downvoter कम से कम टिप्पणी करने की देखभाल करता है, इसलिए मैं देख सकता हूं कि मैं कहां गलत हो सकता हूं? –

+6

मुझे लगता है कि OP _already_ जानता है और यह पूछ रहा है कि यह प्रारंभिकरण कहां हो रहा है। –

+0

@ सेल्मन 22 आपका क्या मतलब है "कहां"? सी # को एमएसआईएल कोड में संकलित किया गया है, और उसके बाद, संकलन के बाद, यह इस 'सार्वजनिक int j = 0; ' – dyatchenko

1
उदाहरण निर्माण के दौरान

, के वैरिएबल भी उपलब्ध कराया जाता है। और चूंकि int शून्य नहीं है, यह डिफ़ॉल्ट (int) के साथ प्रारंभ होता है। कौन सा 0

1

सी # सामान्य सेट करें int0 है। अधिक के बारे में मूलभूत मूल्यों here

और आगे अधिक पाया क्योंकि वे क्षेत्र हैं इस apply

एक क्षेत्र का प्रारंभिक मूल्य है, चाहे वह एक स्थिर क्षेत्र या एक उदाहरण क्षेत्र हो, डिफ़ॉल्ट मान है। क्योंकि यह है निर्माता में कहीं भी निर्दिष्ट नहीं की गई

डिफ़ॉल्ट निर्माता i12 लेकिन j आवंटित करेगा default मूल्य के रूप में 0 होगा।

11

एक क्षेत्र आरंभीकरण newobj आदेश के माध्यम से एक निर्माता कॉल करने से पहले होता है। MSIL newobj का उपयोग करता है के रूप में हम देख सकते हैं

//000017:   { 
    IL_0000: nop 
//000018:    A g = new A(); 
    IL_0001: newobj  instance void ConsoleApplication1.A::.ctor() 
    IL_0006: stloc.0 
//000019:    Console.WriteLine(g.j); 
    IL_0007: ldloc.0 
    IL_0008: ldfld  int32 ConsoleApplication1.A::j 
    IL_000d: call  void [mscorlib]System.Console::WriteLine(int32) 
    IL_0012: nop 
//000020:   } 

:

using System; 
namespace ConsoleApplication1 
{ 
    public class A { public int j; } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      A g = new A(); 
      Console.WriteLine(g.j); 
     } 
    } 
} 

decompilted MSIL कोड का एक हिस्सा (विधि मुख्य): यह निम्नलिखित सी # कोड के साथ निष्पादन की decompilation के बाद देखना आसान है कि ए कक्षा का एक उदाहरण बनाने के लिए निर्देश। के अनुसार निम्नलिखित microsoft acticle:

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

यदि यह गलत है, तो कृपया टिप्पणी करें, अन्यथा इसे सही उत्तर के रूप में असाइन करें।

+1

मुझे लगता है कि 'newobj' निर्देश कहा जाता है इससे पहले स्मृति वास्तव में शून्य हो गई है। 'newobj' हमेशा gen0 ढेर के अगले अप्रयुक्त टुकड़े को पकड़ता है, और यह गारंटी देने के लिए तुच्छ है कि gen0 ढेर के अप्रयुक्त वर्ग हमेशा शून्य होते हैं (जब ओएस से आता है तो स्मृति शून्य हो जाती है, और कचरा संग्रह के समय फिर से शून्य हो सकती है पास होता है और कॉम्पैक्शन का इस्तेमाल अप्रयुक्त करने के लिए स्मृति का उपयोग करता है) –

2

सी #, int चर हमेशा 0 तक डिफ़ॉल्ट हो जाएंगे जब तक अन्यथा निर्दिष्ट नहीं किया जाता है।

public A() 
{ 
    i=12; 
} 

जब आपके वस्तु instantiated है, अपने i संपत्ति, 12 के लिए शुरू की जाएगी, जबकि अपने j संपत्ति 0.

के लिए शुरू हो जाएगा अपने कोड में: अपने निर्माता में

public class Program 
{ 
    A a = new A(); // You instantiated your object, i will be assigned 12 
    Console.WriteLine(a.i.ToString() + "" + a.j.ToString()); 
    // Your output will be 12 0 because you didn't initialize j so the default is 0 
    Console.ReadLine(); 
} 

मुझे आशा है कि इससे मदद मिलती है!

+0

मुझे डर है कि इस मामले का एक और दिल है। – dyatchenko

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