تعيين القيمة الافتراضية لخصائص الأنواع غير الثابتة؟

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

سؤال

لدي مكون Windows.Forms الذي يحتوي على خاصية "mySize" التي تُرجع بنية الحجم.كنت أنوي أن تقوم هذه الخاصية بحساب mySize الذي تم إرجاعه تلقائيًا استنادًا إلى حجم المكون، ما لم يتم تعيين mySize بشكل صريح، وفي هذه الحالة، قم بإرجاع القيمة المحددة لـ mySize.لسوء الحظ، الآن بعد أن قمت بتضمين المكون في نموذج، قرر مصمم Windows Forms البدء بشكل صريح في إنشاء وتعيين قيمة لخاصية mySize، الأمر الذي أفسدني على الفور.

لذا أحتاج إلى تعيين قيمة افتراضية، بحيث يرحل المصمم ويتركني وشأني.

لقد قرأت عن الإجابات التي تتعامل مع System.ComponentModel.DefaultValue، لذلك أعلم أنه يجب علي تعيين قيمة الخاصية في المُنشئ يدويًا، لكن الإجابات والوثائق التي وجدتها تتعامل فقط مع تعيين DefaultValue of False، وهو ثابت.

بنية الحجم ليست ثابتة ولذلك فإن مترجم VB يشعر بالخوف، ويخبرني أنه لا يمكنني تعيين حجم كقيمة افتراضية لخاصية حجم النوع لأن الأحجام ليست ثوابت.

هذا يجعل عقلي يتألم.

ربما يمكنني حل المشكلة عن طريق استخدام أساليب getMySize وsetMySize بدلاً من استخدام إحدى الخاصيات، ولكنني أرغب في معرفة ما إذا كانت هناك بالفعل أي طريقة لتعيين الخاصية الافتراضية للحجم.

ملحوظة:أنا لا أستخدم mySize كنوع من المحاولات المشوشة لتجاوز خاصية الحجم (التي لها قيمة افتراضية تبلغ 150 × 150، لذلك يبدو أن هناك شيئًا قادرًا على تعيين القيم الافتراضية للأحجام)؛mySize هو مجرد قيمة الحجم التي تتطلبها الفئة.

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

المحلول

بدلاً من تطبيق سمة DefaultValue، اكتب الطريقتين التاليتين:

bool ShouldSerializemySize() { ... }
void ResetmySize() { ... }

في DoesSerializemySize، قم بإرجاع true إذا كان يجب إجراء تسلسل للقيمة إلى رمز.في ResetmySize، قم بإعادة تعيين الخاصية إلى قيمتها الافتراضية.

سوف يلتقط مصمم المكونات هذه الأساليب تلقائيًا من خلال التفكير.

مزيد من المعلومات هنا:http://msdn.microsoft.com/en-us/library/53b8022e(VS.71).aspx

نصائح أخرى

لقد لاحظت أن هناك بالفعل مثالًا محددًا لتعيين قيمة افتراضية لحجم النوع في قسم محتوى المجتمع في صفحة MSDN الخاصة بالقيمة الافتراضية, ، والذي يقترح استخدام مُنشئ DefaultValue الموضح في هذه الصفحة.

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

سأضع إجابة البحاري كإجابة على هذا السؤال (لأن إجابته على الأقل منطقية إلى حد ما) واترك هذا المثال هنا من أجل الاكتمال.

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