الفرق بين تهيئة المتغير الثابت في السطر أو في المُنشئ الثابت في C#

StackOverflow https://stackoverflow.com/questions/218461

سؤال

أود أن أعرف ما هو الفرق بين تهيئة عضو ثابت في السطر كما في:

class Foo
{
    private static Bar bar_ = new Bar();
}

أو تهيئته داخل المُنشئ الثابت كما في:

class Foo
{
    static Foo()
    {
        bar_ = new Bar();
    }
    private static Bar bar_;
}
هل كانت مفيدة؟

المحلول

إذا كان لديك مُنشئ ثابت في النوع الخاص بك، فإنه يغير تهيئة النوع بسبب com.beforefieldinit العلم لم يعد مطبقا.

كما أنه يؤثر أيضًا على ترتيب التهيئة - حيث يتم تنفيذ جميع أدوات التهيئة المتغيرة قبل المُنشئ الثابت.

هذا هو الأمر بقدر ما أعرف بالرغم من ذلك.

نصائح أخرى

في هذه الحالة لا أعتقد أن هناك أي سي الفرق العملي. اذا كنت بحاجة الى بعض المنطق في تهيئة المتغيرات الثابتة - مثل إذا كنت تريد أن تستخدم أنواع مختلفة من الخرسانة واجهة نظرا للظروف مختلفة - يمكنك استخدام منشئ ثابت. آخر، وتهيئة مضمنة على ما يرام في كتابي.

class Foo
{
    private static IBar _bar;

    static Foo()
    {
        if(something)
        {
            _bar = new BarA();
        }
        else
        {
            _bar = new BarB();
        }
    }
}

إجابة منطقة الشفق:هناك فرق في ترتيب التنفيذ بين المُهيئات المضمنة وتخصيص ctor ...عند مزج المثيل والأعضاء الثابتين والميراث للتمهيد.

For static members, static initializers 
Static ctors (execute bottom up)
Base static initializer
Base static ctor and so on

For instance members, initializers in current class execute first
Then initializers in base class execute ( up the chain)
Then top-most base ctor is executed (and we walk down now. Instance ctors execute top-down)
Finally current type's ctor is executed.

مثال :)

public class CBase
    {
        static Talkative m_Baseob1 = new Talkative("Base Static Initializer-");
        static Talkative m_Baseob2;
        Talkative m_Baseob3 = new Talkative("Base Inst Initializer");
        Talkative m_Baseob4;
        static CBase()
        {
            Console.WriteLine("***MethodBegin: Static Base Ctor");
            m_Baseob2 = new Talkative("Base Static Ctor");
            Console.WriteLine("***MethodEnd: Static Base Ctor");
        }
        public CBase()
        {
            Console.WriteLine("***MethodBegin: Instance Base Ctor");
            m_Baseob4 = new Talkative("Base Instance Ctor");
            Console.WriteLine("***MethodEnd: Instance Base Ctor");
        }
    }
    public class CDerived : CBase
    {
        static Talkative m_ob1 = new Talkative("Derived Static Initializer");
        static Talkative m_ob2;
        Talkative m_ob3 = new Talkative("Derived Inst Initializer");
        Talkative m_ob4;
        static CDerived()
        {
            Console.WriteLine("***MethodBegin: Derived Static Ctor");
            m_ob2 = new Talkative("Derived Static Ctor");
            Console.WriteLine("***MethodEnd: Derived Static Ctor");
        }
        public CDerived()
        {
            Console.WriteLine("***MethodBegin: Derived Instance Ctor");
            m_ob4 = new Talkative("Derived Instance Ctor");
            Console.WriteLine("***MethodEnd: Derived Instance Ctor");
        }
    }
    internal class Talkative
    {
        public Talkative(string sID)
        {
            Console.WriteLine(sID + " - Talkative created" );
        }
    }

    # Main function somewhere
    CDerived s = new CDerived();

انتاج:

Derived Static Initializer - Talkative created

***MethodBegin: Derived Static Ctor
Derived Static Ctor - Talkative created
***MethodEnd: Derived Static Ctor

Derived Inst Initializer - Talkative created

Base Static Initializer- - Talkative created

***MethodBegin: Static Base Ctor
Base Static Ctor - Talkative created
***MethodEnd: Static Base Ctor

Base Inst Initializer - Talkative created

***MethodBegin: Instance Base Ctor
Base Instance Ctor - Talkative created
***MethodEnd: Instance Base Ctor

***MethodBegin: Derived Instance Ctor
Derived Instance Ctor - Talkative created
***MethodEnd: Derived Instance Ctor 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top