ما الفرق في هذه الطرق من خلق مثيل ثابتة لعن المفردة؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد كان علة مؤخرا أن فقط تجلت عندما تم بناء المكتبة بمثابة إنشاء إصدار بدلا من بناء تصحيح. المكتبة هي مكتبة الارتباط الحيوي. NET مع مجمع COM وأنا باستخدام CoCreateInstance لإنشاء فئة من DLL في ج ++ التطبيق غير المدارة. عندما تتبع أخيرا علة أسفل كان سببه الوصول إلى الكائن المفرد. كنت قد المقام المفرد أعلن مثل ذلك:

private static readonly MyObjectType s_instance = new MyObjectType;

ومن ثم الوصول إليه مع:

public static MyObjectType Instance 
    { 
        get 
        {                               
            return s_instance; 
        } 
    } 

وكان هذا الفشل. تغييره إلى:

private static MyObjectType s_instance;

public static MyObjectType Instance 
    { 
        get 
        {               
            if (s_instance==null) 
            { 
                s_instance = new MyObjectType(); 
            } 
            return s_instance; 
        } 
    } 

وإصلاح المشكلة. أي أفكار لماذا استخدام الأولي لا يعمل وإذا كان هناك أي سلبيات لفعل ذلك في اي من الاتجاهين؟

ودلل الإفراج يبدو أن تكون صالحة للاستعمال تماما من التطبيق آخر المدارة.

هل كانت مفيدة؟

المحلول

وحاول إضافة (فارغة) منشئ ثابت، أو تهيئة المفرد في منشئ ثابت.

وجون السكيت لديه مناقشة كاملة لأنماط المفرد هنا . لست متأكدا لماذا فشلت، ولكن في تخمين ذلك يمكن أن تتصل العلم "beforefieldinit". رؤية مثاله 4TH، حيث يضيف منشئ ثابت إلى قرص هذا العلم. أنا لا أدعي أن يكون خبيرا في beforefieldinit، ولكن هذا العرض يبدو لتناسب بعض الأعراض التي نوقشت <لأ href = "http://www.yoda.arachsys.com/csharp/beforefieldinit.html" يختلط = "noreferrer "> هنا .

نصائح أخرى

وماذا قال مارك Gravell فقط مجددا، ولكن يبدو <م> الكثير مثل مشكلة beforefieldinit، وهو ما يعني المنشئ ثابت فارغ هو الحل. كنت بحاجة إلى إضافة أي وجميع الصانعين في الصف للحصول على إجابة محددة.

والطريقة الثانية لديه ميزة التحميل كسول (حيث أن ميزة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top