سؤال

في دلفي ، إذا كان هناك استثناء من خلال بناء كائن:أي الذاكرة المخصصة سيفرج عنه و الاستثناء أن يتم طرح.على سبيل المثال التالي كان مضمونة إما عودة صالح Camera كائن أو رمي استثناء:

Camera c = new Camera();

لك أبدا للتحقق من الناتج متغير null:

Camera c = new Camera();
if (c == null)
   throw new Exception("Error constructing Camera") //waste of time

هو نفسه صحيح في CLR?

و هناك أخرى syntatical constucts حيث قيمة الإرجاع هي ضمان أن تكون إما صحيحة أو رمي استثناء ؟

  • إنشاء هياكل (مثلا ، مستطيل)?
  • الحصول على عضو من التعداد?
  • نتيجة الكائن.ToString()?
  • mathmatical العمليات ؟

في حالة أداء الرياضيات:

Int32 aspect = 1650.0 / 1080.0;
if (aspect == null) 
   throw new Exception("Division of two numbers returned null")
هل كانت مفيدة؟

المحلول

منشئ في .صافي يضمن عودة غير فارغة سبيل المثال من نوع الكائن.أم لا مثيل صالح يعتمد على الفرد دلالات نوع.

استثناءات في منشئ لا يكون تعسفيا ابتلعها CLR (على الرغم من رمز المستخدم يمكن ابتلاعها).CLR سيتم نشر استثناء مثل استثناءات في أي طريقة أخرى و الكائنات سوف يكون في نهاية المطاف بشكل صحيح القمامة التي تم جمعها.

أما الحالات الأخرى التي ذكرتها

  • إنشاء الهياكل:هياكل بحكم التعريف لا يمكن أن يكون من أي وقت مضى null.استثناءات في منشئ سوف تنتشر عادة
  • الحصول على عضو من التعداد:التعدادات هي strutures / أنواع قيمة تحت غطاء محرك السيارة و أيضا لن تكون فارغة
  • نتيجة الكائن.ToString():هذا يمكن (و للأسف) سوف تكون فارغة.سلسلة هو نوع مرجع و انها قانونية تماما أن العودة فارغة من ToString تجاوز (من فضلك لا).
  • العمليات الحسابية:هذا يعتمد بشكل كبير على كل من تجاوز إعداد المشروع الخاص بك ونوع معين المستخدمة (جزءا لا يتجزأ مقابلالنقطة العائمة).

الرياضية السؤال تقريبا يستحق جوابا على نفسه.من ناحية نتيجة عملية حسابية على أنواع بدائية لن تكون فارغة.ولكن لا يزال يمكن أن تكون غير صالحة.على سبيل المثال التعليمات البرمجية التالية لن رمي ولكن ما إذا كان أو لم يكن نتيجة صحيحة يعتمد إلى حد كبير على سيناريو معين

float f1 = 1.0;
float f2 = f1 / 0;

عند هذه النقطة f2 هو محدد جدا تطفو القيمة التي لا تمثل العدد الحقيقي.هل هي صالحة ؟ يعتمد على استخدامك القضية.

نصائح أخرى

نعم.أود أن وضعه بهذه الطريقة (كما تفشل قد يعني عدم منطقية أيضا):إذا كان منشئ لا رمي استثناء قيمة الإرجاع هي ضمان أن تكون غيرnull لذلك كنت لا داعي لإجراء مثل هذا الاختيار.

إنشاء هياكل (مثلا ، مستطيل):A struct لا يمكن أن يكون null في كل (Nullable أنواع تعتبر أنواع مختلفة تماما ، أي typeof(int?) != typeof(int)).استدعاء منشئ الهيكل أن تفشل إما عن طريق رمي استثناء أو العودة مثيل.

الحصول على عضو من التعداد:وهو enum هو مجرد مجموعة من الثوابت.لا يوجد شيء مثل "الحصول على الأعضاء في وقت التشغيل." إنه استبداله في وقت الترجمة.

نتيجة Object.ToString():مثل أي وسيلة يمكن أن ترجع أي قيمة صحيحة من أجل string النوع الذي يتضمن null و يمكن أيضا رمي استثناء (في هذه الحالة فإنه لا قيمة على الإطلاق).

العمليات الحسابية:جميع التعبيرات سيتم إرجاع قيمة أو رمي استثناء.يمكن إرجاع القيمة أي قيمة صالحة لهذا النوع (على سبيل المثال Int32 لا يمكن أبدا أن يكون null).

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