سؤال

لذلك أفهم ماهية الملاكمة والملاكمة. متى يتم عرضه في رمز العالم الحقيقي ، أو في أي أمثلة هي مشكلة؟ لا أستطيع أن أتخيل فعل شيء مثل هذا المثال:

int i = 123;
object o = i;           // Boxing
int j = (int)o;     // Unboxing

... لكن هذا من المؤكد أنه من المفرط للغاية ، وربما كنت قد قمت بالملاكمة/إلغاء التفاح دون معرفة ذلك من قبل.

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

المحلول

إنه كثيراً أقل من مشكلة الآن مما كانت عليه قبل الأدوية. الآن ، على سبيل المثال ، يمكننا استخدام:

List<int> x = new List<int>();
x.Add(10);
int y = x[0];

لا يوجد ملاكمة أو إلغاء التزام المطلوب على الإطلاق.

في السابق ، كان لدينا:

ArrayList x = new ArrayList();
x.Add(10); // Boxing
int y = (int) x[0]; // Unboxing

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

بدون مشاركة الأدوية الجيرية ، أعتقد أنني ربما أقول أن الانعكاس هو السبب الأكثر شيوعًا للملاكمة في المشاريع التي عملت عليها. تستخدم واجهات برمجة تطبيقات الانعكاس دائمًا "كائن" لأشياء مثل قيمة الإرجاع للطريقة - لأنه ليس لديهم طريقة أخرى لمعرفة ما يجب استخدامه.

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

نصائح أخرى

عادة ما يحدث الملاكمة (في تجربتي) في هذه الحالات:

  • يتم تمرير نوع القيمة إلى طريقة تقبل وسيطة من النوع Object.
  • تتم إضافة نوع القيمة إلى مجموعة غير جينية (مثل ArrayList).

في أوقات أخرى ، يمكنك رؤية الملاكمة والملاكمة عند استخدام الانعكاس لأن واجهة برمجة تطبيقات انعكاس .NET Framework تستخدمها بكثافة Object.

يحدث الملاكمة/غير الملاكمة عندما يتم تمرير نوع القيمة (مثل البنية ، int ، طويلة) في مكان يقبل نوع مرجع - مثل object.

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

سترى أيضًا الملاكمة تحدث عند استخدامها String.Format() وتمرير البدائية لذلك. هذا بسبب String.Format() يقبل كائن params [] - مما يؤدي إلى ملاكمة المعلمات الإضافية في المكالمة.

يمكن أن يؤدي استخدام انعكاس للاستدعاء إلى الأساليب أيضًا إلى الملاكمة/إلغاء التفسير ، لأن واجهات برمجة التطبيقات للانعكاس ليس لها خيار سوى العودة object نظرًا لأن النوع الحقيقي غير معروف في وقت الترجمة (ولا يمكن أن يكون واجهات برمجة تطبيقات الانعكاس عامة).

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

يمكنك تجنب مخاوف الملاكمة عن طريق تغيير الأساليب التي تقبل الكائنات لتكون عامة. علي سبيل المثال:

public void string Decorate( object a ) // passing a value type results in boxing
{
   return a.ToString() + " Some other value";
}

ضد:

public void string Decorate<T>( T a )
{
   return a.ToString() + " some other value";
}

ها هو واحد سيء حقا :)

SqlCommand cmd = <a command that returns a scalar value stored as int>;

// This code works very well.
int result = (int)cmd.ExecuteScalar();

// This code will throw an exception.
uint result = (uint)cmd.ExecuteScalar();

يفشل التنفيذ الثاني لأنه يحاول إلغاء مراقبة int32 في uint32 وهو أمر غير ممكن. لذلك عليك إلغاء الابتكار أولاً ومن الممثل.

uint result = (uint)(int)cmd.ExecuteScalar();

الملاكمة والملاكمة تنتقل حقًا من نوع القيمة إلى النوع المرجعي. لذلك ، فكر في الأمر على أنه ينتقل من المكدس إلى الكومة والعودة مرة أخرى.

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

يحدث ذلك طوال الوقت عندما لا يعرف الناس ما هي الآثار المترتبة ، ببساطة لا تهتم أو في بعض الأحيان لا يمكن للمرء إلا أن يقبل الملاكمة باعتبارها EVEL الأقل.

سوف يتم وضع قواعد البيانات المكتوبة بقوة/unbox إلى حد كبير طوال الوقت عند الوصول إلى خاصية من نوع القيمة. أيضًا ، سيؤدي استخدام نوع القيمة كمرجع للواجهة إلى مربعه أيضًا. أو الحصول على مندوب من طريقة مثيل لنوع القيمة. (هدف المندوب هو كائن نوع)

نظرًا لأن ظهور القوائم والقواميس القوية التي تستخدم الأداء العام مع C# 2.0 (Visual Studio 2005) ، أعتقد أن أهمية الاحتفاظ بالملاكمة/غير الملاكمة في الاعتبار قد تم تقليلها بشكل مثير للدهشة. أضف إلى تلك الأنواع الباطئة (int?, ، وما إلى ذلك) واستخدام مشغل الفحم الفارغ (??) ولا ينبغي أن يكون الأمر مصدر قلق كبير على الإطلاق ، ومن المحتمل ألا يراها في أي رمز ليس 1.1 إطارًا أو سابقًا.

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