اللمسات النهائية الثابتة
-
05-07-2019 - |
سؤال
ما هي الطريقة الصحيحة لإجراء بعض اللمسات النهائية الثابتة؟
لا يوجد مدمر ثابت.ال AppDomain.DomainUnload
لم يتم رفع الحدث في المجال الافتراضي.ال AppDomain.ProcessExit
يقوم الحدث بمشاركة الوقت الإجمالي للثواني الثلاث (الإعدادات الافتراضية) بين جميع معالجات الأحداث، لذا فهو غير قابل للاستخدام حقًا.
المحلول
وفي الأساس، لا يمكنك. تصميم طريقك حولها إلى أقصى حد ممكن.
ولا ننسى أن البرنامج يمكن أن <م> دائما م> إنهاء فجأة على أي حال - شخص سحب الطاقة الكهربائية هي مثال واضح. لذا فان أي شيء تفعله يجب أن يكون "أفضل جهد". - في هذه الحالة كنت بالتأكيد <م> أمل م> شأنه أن AppDomain.ProcessExit
تكون جيدة بما فيه الكفاية
وماذا عليك القيام به، في حالة معينة؟
نصائح أخرى
Herfried فاغنر على مقالة ممتازة شرح كيفية تنفيذ هذا - للأسف، في الألمانية (وVB). ومع ذلك، يجب أن يكون رمز مفهومة.
اقتباس فقرة>ولقد حاولت ذلك:
static readonly Finalizer finalizer = new Finalizer();
sealed class Finalizer {
~Finalizer() {
Thread.Sleep(1000);
Console.WriteLine("one");
Thread.Sleep(1000);
Console.WriteLine("two");
Thread.Sleep(1000);
Console.WriteLine("three");
Thread.Sleep(1000);
Console.WriteLine("four");
Thread.Sleep(1000);
Console.WriteLine("five");
}
}
ويبدو أن يعمل بنفس الطريقة تماما كما يفعل الحدث AppDomain.ProcessExit
: في finalizer يحصل كاليفورنيا. ثلاث ثوان ...
والسؤال الذي يطرح نفسه ما الذي تقوم بتحميله في أساليب ثابتة الخاص التي تحتاج إلى أن أفرج عنه. أنا بالتأكيد لا أوصي تفعل هذه الأشياء في أسلوب ثابت.
وقال ذلك، أسلوب ثابت الخاص يمكن أن instanciate كائن له طريقة وضع الصيغة النهائية.
حلان يتبادران إلى الذهن:
- لا تستخدم فئة ثابتة.إذا كنت تستخدم فئة غير ثابتة وقمت بإنشاء مثيل لها، فلا داعي للقلق بشأن التنظيف كثيرًا.
- إذا لم يكن هذا خيارًا، فأنا أزعم أن هذا وضع جيد لاستخدام المفردة.سيؤدي هذا إلى إنشاء نسخة من الكائن الخاص بك واستدعاء أداة الإنهاء عند الخروج، ولكن لا يزال يسمح لك بمعاملته كفئة ثابتة في معظم الأحيان.بعد كل شيء، صفك ثابت بالفعل وبالتالي يشترك في معظم الأسباب الشائعة لعدم استخدام المفردة.
لإجابة ميناء مايكل Damatov في (C #) الذي يقوم على أساس Herfried K. فاغنر. (VB.NET) هنا هو C ++ / CLI نسخة:
ref class MyClass
{
ref class StaticFinalizer sealed
{
!StaticFinalizer();
};
static initonly StaticFinalizer^ stDestr = gcnew StaticFinalizer();
}
MyClass::StaticFinalizer::!StaticFinalizer()
{
System::Diagnostics::Debug::WriteLine("In StaticFinalizer!");
}
وP.S. تماما مثل طريقة AppDomain.ProcessExit، قد لا يتم استدعاء هذا واحد إذا تم إنهاء عملية بشكل غير طبيعي (من إدارة المهام على سبيل المثال). كلمة أخرى من الحذر هو أنه إذا كان MyClass هو عام (قالب)، على افتراض أن لها منشئ ثابت والمدمر ثابت وسوف يطلق ما لا يزيد عن مرة واحدة في تنفيذ التطبيق لم يعد صالحا.