मैं एकता 2017 में सिंगलटन बनाने की कोशिश कर रहा था।

public class Singleton {

    public static readonly Singleton instance = new Singleton();

    static readonly float FLOAT_VAL = 3.5f;
    static readonly int INT_VAL = 3;

    private Singleton() {
        Debug.Log("FLOAT_VAL = " + FLOAT_VAL);
        Debug.Log("INT_VAL = " + INT_VAL);
    }
}

मुझे "FLOAT_VAL = 3.5" और "INT_VAL = 3" का आउटपुट देखने की उम्मीद थी। हालांकि, यह "FLOAT_VAL = 0" और "INT_VAL = 0" के आउटपुट के साथ सामने आया। फिर मैंने "स्थिर" छोड़कर दोनों "केवल पढ़ने योग्य" संशोधक हटा दिए और अभी भी दो शून्य प्राप्त हुए।

इस सिंगलटन की शुरुआत या निर्माण का क्या हुआ? मैं स्थिर चर को मान कैसे सही ढंग से दे सकता हूं? क्या एकता से कोई लेना-देना है? (मैंने प्रोजेक्ट बनाते समय il2cpp को चुना, लेकिन इसका परीक्षण संपादक मोड के तहत किया गया था)

वैसे, मुझे पता चला कि वैरिएबल "instance" की शुरुआत पहली कॉल तक शुरू नहीं हुई थी (मुझे लगता था कि असेंबली लोड होने पर सभी स्टैटिक वर्र्स इनिशियलाइज़ हो जाते हैं।) क्या यह भी एक और एकता विशेषता है या सामान्य है?

1
GuardHei 29 अप्रैल 2018, 13:39

3 जवाब

सबसे बढ़िया उत्तर

फ़ील्ड उस क्रम में प्रारंभ हो जाते हैं जिस क्रम में उन्हें घोषित किया जाता है .... इसलिए चूंकि आपका उदाहरण पहले आता है, आपके अन्य मान शून्य हैं। यदि आप उन्हें अपने उदाहरण से ऊपर ले जाते हैं तो उनके पास वे मान होंगे जिनकी आप अपेक्षा करते हैं

2
Keith Nicholas 29 अप्रैल 2018, 13:53

सी # भाषा विनिर्देश से

§10.5.5.1

स्टेटिक फील्ड इनिशियलाइज़ेशन

एक वर्ग के स्थिर क्षेत्र चर प्रारंभकर्ता a . के अनुरूप हैं असाइनमेंट का क्रम जो पाठ्य क्रम में निष्पादित किया जाता है जो वे कक्षा घोषणा में दिखाई देते हैं। यदि कोई स्थिर निर्माता है (§10.12) कक्षा में मौजूद है, स्थिर क्षेत्र का निष्पादन प्रारंभकर्ता उस स्थैतिक को निष्पादित करने से तुरंत पहले होता है कंस्ट्रक्टर। अन्यथा, स्टैटिक फील्ड इनिशियलाइज़र्स को निष्पादित किया जाता है एक स्थैतिक के पहले उपयोग से पहले एक कार्यान्वयन-निर्भर समय उस वर्ग का क्षेत्र।

तो मूल रूप से, क्योंकि आपने पहले instance लिखा था, इसे FLOAT_VAL और INT_VAL से पहले इनिशियलाइज़ किया गया है। आदेश को उलट दें और आप अपने अपेक्षित परिणाम देखेंगे:

public class Singleton {


    static readonly float FLOAT_VAL = 3.5f;
    static readonly int INT_VAL = 3;


    public static readonly Singleton instance = new Singleton();

    private Singleton() {
        Console.WriteLine("FLOAT_VAL = " + FLOAT_VAL);
        Console.WriteLine("INT_VAL = " + INT_VAL);
    }
}
1
Sweeper 29 अप्रैल 2018, 13:58

यदि आपकी कक्षा में स्थिर क्षेत्र हैं, तो एक स्थिर निर्माता प्रदान करें जो कक्षा के लोड होने पर उन्हें आरंभ करता है। [MSDN]

अपने स्टैटिक वैरिएबल को इनिशियलाइज़ करने के लिए एक स्टैटिक कंस्ट्रक्टर जोड़ें

-1
buffalo94 29 अप्रैल 2018, 13:58