هل تتصرف التآكل التلقائي والملابس بشكل مختلف في Java و C#
-
22-09-2019 - |
سؤال
أقوم بتحويل التعليمات البرمجية يدويًا من Java (1.6) إلى C# وأجد بعض الصعوبة في سلوك البدائل (int و double). في C# يبدو أن جميع التحويلات تحدث تلقائيًا تقريبًا
List<double> list1 = new List<double>(); // legal, C#
double d0 = 3.0;
list1.Add(d0); // legal, C#
Double dd = 2.3f; // legal, C#
list1.Add(dd); // legal, C#
List<Double> list2 = new List<Double>(); // legal, C#
double d1 = 3.0;
list2.Add(d1); // legal, C#
list2.Add(2.0); // legal, C#
double d2 = list2.get(0); // legal, C#
لكن في جافا مسموح ببعضها فقط
List<double> list1 = new ArrayList<double>(); // illegal, Java
List<Double> list2 = new ArrayList<Double>(); // legal, Java
double d1 = 3.0;
list2.add(d1); // legal, Java
list2.add(2.0); // legal, Java
double d2 = list2.get(0); // legal, Java
سأكون ممتنًا لتحليل منهجي للاختلافات وأي الأساس المنطقي الأساسي.
المحلول
في مثال C# ، لا يوجد ملاكمة أو إلغاء التفاح (و Autoboxing). double
هو مجرد الاسم المستعار ل struct
Double
.
في جافا ، الملاكمة ضرورية. بسبب اكتب المحو, ، لا يمكنك إنشاء ملف List<double>
, ، فقط List<Double>
. في وقت الترجمة ، List<?>
يصبح List<Object>
وستحتاج الملاكمة/إلغاء اللاصطناب إلى حدوثها حتى تتمكن من إضافة متغير من النوع الأصلي إلى أ List<Object>
أو تعيين متغير أصلي لعنصر القائمة.
نصائح أخرى
في C#، double
و Double
نكون بالضبط نفس الشيء (طالما أنك لم تنشئ نوعك الخاص المسمى Double
, ، والتي ستكون غبية).
double
هو يعرف كمستعار ل global::System.Double
. على هذا النحو ، لا يوجد ملاكمة هنا.
في جافا ، Double
هو محاصر double
, ، مع كون الأنواع الإرهبية جزءًا رئيسيًا من تنفيذ الأدوية الجيرية.