2013-02-02 12 views
5

मैं समझने की कोशिश कर रहा हूं कि स्थिर और सार्वजनिक गुणों के बीच क्या अंतर है। लेकिन जब मैंने अपनी सार्वजनिक संपत्ति 'टेस्ट' को दूसरे रूप में एक्सेस करने का प्रयास किया तो यह 'शून्य' कहता है।सी # विनफॉर्म: स्थिर और सार्वजनिक गुणों के बीच अन्य रूपों और अंतर से सार्वजनिक गुणों तक पहुंच

यहाँ Form1:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private string _test; 

    public string Test 
    { 
     get { return _test; } 
     set { _test = value; } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     _test = "This is a test"; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.Show(); 
    } 
} 

यहाँ Form2 है:

label1.Text = frm1.Test; 

:

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     Form1 frm1 = new Form1(); 
     label1.Text = frm1.Test; 
    } 
} 

Form1 में 'टेस्ट' के मान की जाँच करने के लिए, मैं इस लाइन के लिए एक ब्रेकपाइंट डाल लेकिन मूल्य 'शून्य' है।

कृपया मेरी सहायता करें कि मैं अन्य रूपों में सार्वजनिक संपत्तियों का उपयोग कैसे कर सकता हूं।

और बीटीडब्ल्यू मैंने इस सार्वजनिक संपत्ति को 'सार्वजनिक स्थैतिक' बनाने की कोशिश की। मैं इसका उपयोग कर इस तक पहुंच सकता हूं:

Form1.Test 

लेकिन मैंने देखा कि मैं फॉर्म 2 से 'टेस्ट' मान बदल सकता हूं जो मैं नहीं करना चाहता हूं। यही कारण है कि मैं सार्वजनिक संपत्ति का उपयोग करने की कोशिश कर रहा हूं लेकिन बिना किसी किस्मत के। क्या कोई मुझे इन चीजों को स्पष्ट कर सकता है। मदद के लिए आप सभी का धन्यवाद!

EDIT: (For follow up question) 

सर जॉन कोर्नर का जवाब मेरे प्रश्न का सबसे अच्छा जवाब है। लेकिन मेरे पास एक फॉलो अप प्रश्न है, मैंने इन 'टेस्ट' गुणों को 'स्थैतिक' बनाने की कोशिश की, और मैंने देखा कि अगर मैं इस संपत्ति को स्थिर या सार्वजनिक संपत्ति बना देता हूं, तो भी इसे फॉर्म 2 में संपादित किया जा सकता है। अपने आप को यहाँ स्पष्ट करना एक नमूना है:

public partial class Form2 : Form 
{ 
    private Form1 f1; 
    public Form2(Form1 ParentForm) 
    { 
     InitializeComponent(); 
     f1 = ParentForm; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     label1.Text = f1.Test; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     f1.Test = "This test has been changed!"; 

     this.Close(); 
    } 
} 

बाद Form2 बंद कर दिया, मैं Form1_Load में फिर से तोड़ने के लिए 'टेस्ट' के मान की जाँच करने की कोशिश की, और यह बदल गया था! फॉर्म 2 में केवल पढ़ने के लिए फॉर्म 1 में सार्वजनिक संपत्ति कैसे बना सकती है और इसे संपादित नहीं किया जा सकता है? कृपया मुझे स्पष्टीकरण दें। बहुत बहुत धन्यवाद दोस्तों!

उत्तर

6

आपकी संपत्ति एक आवृत्ति चर है, इसलिए मान Form1 के विभिन्न उदाहरणों में भिन्न हो सकता है।

यदि आप मूल रूप से इंस्टेंस चर का उपयोग करने का प्रयास कर रहे हैं, तो ऐसा करने का सबसे आसान तरीका फॉर्म 2 के निर्माता को फॉर्म 1 पास करना है।

public partial class Form2 : Form 
{ 
    private Form1 f1; 
    public Form2(Form1 ParentForm) 
    { 
     InitializeComponent(); 
     f1 = ParentForm; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     label1.Text = f1.Test; 
    } 
} 

फिर जब आप Form1 से एक नया Form2 बनाते हैं तो आप ऐसा कर सकते हैं:

Form2 frm2 = new Form2(this); 

यदि आप चाहते हैं अपनी संपत्ति केवल पढ़ने के लिए, आप बस एक सेटर निर्दिष्ट नहीं कर सकते:

public string Test 
{ 
    get { return _test; } 
} 
+0

इस आदमी के लिए धन्यवाद, कृपया मेरे अनुवर्ती प्रश्न के लिए मेरा संपादन देखें, मुझे उम्मीद है कि मैंने अपना प्रश्न स्पष्ट कर दिया है। – jomsk1e

+0

@ जेआरसी मेरा संपादन देखें। –

+0

यह है! आपकी मदद जॉन के लिए धन्यवाद! आप से अच्छा सबक! नौसिखिया होने के लिए खेद है :( – jomsk1e

0

frm1 आपका मुख्य फॉर्म ऑब्जेक्ट नहीं है। यह नव निर्मित वस्तु है जहां संपत्ति Test लोड होने पर प्रारंभ होती है (Form1_Load ईवेंट हैंडलर में)।

0

Form1 का पहला उदाहरण Form2 का एक उदाहरण से पता चलता है, और फिर Form2बनाता Form1 का एक और उदाहरण।यह काम कर सकता है, लेकिन आप Form.Load घटना है, जिसमें _test सेट:

से पहले होता है एक रूप पहली बार के लिए प्रदर्शित किया जाता है।

आप Form1 का उदाहरण नहीं दिखाते, इसलिए इसकी Load घटना घटित नहीं होगा और Testnull बनी हुई है आप, से Test को पढ़ने के लिए कोशिश कर रहे हैं।

आप फॉर्म 1 संदर्भ को @JohnKoerner उल्लेख के रूप में पास करने के लिए एक कन्स्ट्रक्टर ओवरलोड या प्रॉपर्टी जोड़ सकते हैं, लेकिन मैं केवल युग्मन को कम करने के लिए आवश्यक चर को पारित करना चाहता हूं, शायद किसी ईवेंट में भी encapsulated। Form2 आमतौर पर Form1 के बारे में सभी को जानने की आवश्यकता नहीं है।

-1

सार्वजनिक

प्रकार या सदस्य एक ही विधानसभा में किसी भी अन्य कोड से या किसी अन्य विधानसभा यह संदर्भ द्वारा पहुँचा जा सकता।

स्थिर

एक वर्ग पर स्थिर संशोधक मतलब यह है कि वर्ग instantiated नहीं किया जा सकता है, और इसके सभी सदस्यों को स्थिर रहे हैं। एक स्थिर सदस्य के पास एक संस्करण है, इस पर ध्यान दिए बिना कि इसके संलग्न प्रकार के कितने उदाहरण बनाए गए हैं।

एक स्थैतिक वर्ग मूल रूप से एक गैर स्थैतिक वर्ग के समान होता है, लेकिन एक अंतर होता है: एक स्थिर वर्ग को बाहरी रूप से तत्काल नहीं किया जा सकता है। दूसरे शब्दों में, आप वर्ग प्रकार के चर बनाने के लिए नए कीवर्ड का उपयोग नहीं कर सकते हैं। चूंकि कोई आवृत्ति परिवर्तनीय नहीं है, इसलिए आप क्लास नाम का उपयोग करके एक स्थिर वर्ग के सदस्यों तक पहुंच सकते हैं।

हालांकि, एक स्थिर निर्माता के रूप में ऐसी चीज है। स्थिर वर्ग सहित किसी भी वर्ग में इनमें से एक हो सकता है। उन्हें सीधे & नहीं कहा जा सकता है पैरामीटर नहीं हो सकता है (कक्षा में किसी भी प्रकार के पैरामीटर के अलावा)। पहले इंस्टेंस बनने से पहले कक्षा को प्रारंभ करने के लिए स्वचालित रूप से एक स्थिर कन्स्ट्रक्टर को कॉल किया जाता है या किसी स्थिर सदस्यों का संदर्भ दिया जाता है। इस तरह दिखता है:

स्थिर वर्ग फू() { स्थिर फू() { बार = "fubar"; }

public static string Bar { get; set; } 

}

स्टेटिक वर्गों अक्सर सेवाओं के रूप में उपयोग किया जाता है, तो आप उन्हें इतना तरह उपयोग कर सकते हैं:

MyStaticClass.ServiceMethod (...);

1

इस विधि 'स्थिर'

पहले नियंत्रण लेबल संपत्ति संशोधक पर की में नीचे

Program.frm2.show(); 

Form1 कोड में नीचे

public static Form1 frm1 = new Form1(); 
public static Form2 frm2 = new Form2(); 

उपयोग = सार्वजनिक

कार्यक्रम कोड में

से नीचे फॉर्म 2 कोड 10
label1.Text=Program.frm1.text; 
संबंधित मुद्दे