2010-01-07 13 views
13

संभव डुप्लिकेट:
C# constructor execution orderसी # आधार() निर्माता आदेश

class Foo 
{ 
    public int abc; 
    Foo() 
    { 
     abc = 3; 
    } 

} 

class Bar : Foo 
{ 
    Bar() : base() 
    { 
     abc = 2; 
    } 
} 

उपरोक्त उदाहरण में, बार का एक उद्देश्य बन जाता है, क्या BarObject.abc का मूल्य हो जाएगा ? क्या बेस कन्स्ट्रक्टर पहले कहा जाता है, या बार() रन है,/फिर/आधार() कन्स्ट्रक्टर?

+2

सदस्य चर होने के लिए खराब अभ्यास सार्वजनिक हो गया। आप सी # ऑब्जेक्ट्स शुरू करने पर एक अच्छी किताब लेना चाह सकते हैं। – JonH

+3

http://stackoverflow.com/questions/1882692/c-constructor-execution-order का डुप्लिकेट, एक भयानक स्वीकार्य उत्तर और एरिक लिपर्ट ब्लॉग प्रविष्टियों को जोड़ने वाली टिप्पणियों के साथ कम नहीं। –

उत्तर

28

यह 2 होगा। बेस क्लास से पहले उत्तराधिकारी वर्ग तक क्रांति चलाने वाले निर्माता।

ध्यान दें कि प्रारंभिक (दोनों स्थिर और आवृत्ति चर) विपरीत दिशा में चलते हैं।

पूर्ण अनुक्रम यहाँ है: http://www.csharp411.com/c-object-initialization/

+0

शुरुआती पता है कि शुरुआती क्रम में हैं। लेकिन यह 2 अलग-अलग आदेश रखने के लिए इस तरह से क्यों डिजाइन किया गया है? – RayLuo

+1

@RayLuo डुप्लिकेट उत्तर की एक टिप्पणी में समझाया। यह उस पृष्ठ से लिंक होता है जिसका "भाग 2" है [यहां] (https://blogs.msdn.microsoft.com/ericlippert/2008/02/18/why-do-initializers-run-in-the-opposite-order -स-कन्स्ट्रक्टर-भाग-दो /) और कहता है: "" यदि रचनाकार और प्रारंभिक अपने वास्तविक क्रम में चलते हैं तो संदर्भ प्रकार के प्रारंभिक पाठक क्षेत्र को किसी भी संभावित कॉल में शून्य नहीं होने की गारंटी दी जाती है। यह गारंटी तब नहीं मिल सकती है अगर शुरुआती आदेश में शुरुआती आदेश चलाते हैं। " – Quantic

1

परिवर्तनीय एबीसी 3 होने के लिए सेट किया जाएगा और फिर 2 होना चाहिए (मूल निर्माता को पहले कहा जाता है)।

+0

एरर, एबीसी सार्वजनिक है – alastairs

+1

यह तब नहीं था जब उसने पहली बार प्रश्न पोस्ट किया था। मैंने इसे अपने अपडेट को समायोजित करने के लिए हटा दिया है। – kemiller2002

+0

एलिस्टेयर जब वह इसे पोस्ट करता था तब सार्वजनिक नहीं था। – JonH

4

पहले बेस क्लास कन्स्ट्रक्टर को व्युत्पन्न क्लास कन्स्ट्रक्टर के बाद बुलाया जाता है। परिणाम 2 है। आपको स्पष्ट रूप से उस वर्ग चर की पहुंच सुनिश्चित करना चाहिए। क्या यह संरक्षित, निजी या सार्वजनिक है?

मैं तुम्हें अब जनता के लिए इसे बदल देखते हैं, तो यह हो जाएगा 2.

यह लिंक आगे की मदद से आप कंस्ट्रक्टर्स समझते हैं, कि वे किस तरह उपयोग किया जाता है, जब वे कहा जाता है और आदेश निर्माता कॉल के लिए जब आप का उपयोग विरासत:

http://www.yoda.arachsys.com/csharp/constructors.html

इसके अलावा, आप आप अभ्यास और कोड तो लिख बस इसे पढ़ कर और जानेंगे, वास्तव में अपने आप को इस की कोशिश कर सकते हैं।

बार घोषित करने और इसके मूल्य को आउटपुट करने का प्रयास करें। कुछ गुणों का उपयोग करें:

class Foo 
    { 
     public int abc; 
     public Foo() 
     { 
      abc = 3; 
     } 

     public int ABC 
     { 
      get { return abc; } 
      set { abc = value; } 
     } 

    } 

    class Bar : Foo 
    { 
     public Bar() : base() 
     { 
      abc = 2; 
     } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      Bar b = new Bar(); 
      Console.WriteLine(b.ABC); 
      Console.ReadLine(); 

     } 
    } 

एक साधारण प्रिंटआउट परिणाम प्रदान करेगा जो आप खोज रहे हैं।

alt text http://img141.imageshack.us/img141/9238/rrrrr.jpg

तुम सिर्फ प्यार मत करो मेरी namespace :-): यहाँ उत्पादन होता है। जिस तरह से आप स्वचालित गुणों का भी उपयोग कर सकते हैं ताकि संपत्ति केवल सार्वजनिक int एबीसी {get; set;} हो।

1

आधार निर्माता called first होगा, लेकिन यह कोड संकलित नहीं करता है। निजी क्षेत्र उप-वर्गों से accesable नहीं हैं। कम से कम एक क्षेत्र को उप-वर्ग में उपयोग करने के लिए protected होना चाहिए।

लेकिन यह भी जानना, आप जिस व्यवहार का प्रयास कर रहे हैं वह भ्रमित है क्योंकि यह आश्चर्यजनक है। बस तथ्य यह है कि आपको यह पूछना था कि कौन सी ऑर्डर चीजें चलती हैं, इसका तात्पर्य है कि ऑर्डर भूल जाने पर यह गड़बड़ हो जाएगा।

1

आधार constuctor पहले कहा जाता है, और आप एबीसी

2

के लिए 2 का मान होता है मान लिया जाये कि आप एबीसी संरक्षित ताकि इस संकलित कर, यह 2 हो जाएगा ; हालांकि, base() को पहले कहा जाता है।

इस तरह की सामग्री के लिए, एक सरल परीक्षण आवेदन लिखें और उत्तर खोजने के लिए कुछ ब्रेकपॉइंट्स सेट करें।

+0

+1 सरल परीक्षण लिखने का सुझाव देने के लिए – ChrisF

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