ما هو الملاكمة و علبته و ما هي التجارة للعمال ؟
-
08-06-2019 - |
سؤال
أنا أبحث عن واضحة وموجزة ودقيقة الإجابة.
بطبيعة الحال الإجابة الفعلية ، على الرغم من وصلات إلى تفسيرات جيدة موضع ترحيب.
المحلول
محاصر القيم هياكل البيانات التي هي الحد الأدنى مغلفة حول أنواع بدائية*.محاصر القيم يتم تخزينها عادة مؤشرات الكائنات على كومة.
وهكذا محاصر القيم استخدام المزيد من الذاكرة وتأخذ في الحد الأدنى من اثنين من الذاكرة عمليات البحث للوصول إلى:مرة واحدة للحصول على مؤشر آخر إلى متابعة هذا المؤشر إلى البدائية.ومن الواضح أن هذا ليس هو النوع من الشيء الذي تريد في الداخلية الخاصة بك الحلقات.من ناحية أخرى, محاصر القيم يلعب بشكل أفضل مع أنواع أخرى في النظام.لأنها هي من الدرجة الأولى هياكل البيانات في لغة لديهم المتوقع الفوقية و هيكل البيانات الأخرى الهياكل.
في جافا هاسكل ومجموعات عامة لا يمكن بدون علبة تحتوي على القيم.عامة في مجموعات .صافي يمكن أن تعقد بدون علبة القيم مع أي عقوبات.حيث جافا الأدوية تستخدم فقط وقت التحويل البرمجي نوع التحقق .صافي إنشاء فئات محددة لكل نوع عام مثيل في وقت التشغيل.
جافا هاسكل يكون بدون علبة المصفوفات ، لكنهم بوضوح أقل ملاءمة من مجموعات أخرى.ومع ذلك ، عندما ذروة الأداء هو مطلوب يستحق القليل من الإزعاج لتجنب النفقات العامة من الملاكمة و علبته.
* في هذه المناقشة, بدائية قيمة أي التي يمكن تخزينها على مكدس الاستدعاءات, بدلا من تخزينها على شكل المؤشر إلى قيمة على كومة.في كثير من الأحيان هذا مجرد آلة أنواع (رجات, العوامات, الخ), البنيات, و في بعض الأحيان ثابت الحجم المصفوفات..صافي-أرض يدعو لهم أنواع قيمة (بدلا من أنواع المراجع).جافا الناس ندعو لهم أنواع بدائية.Haskellions فقط ندعو لهم بدون علبة.
** أنا أيضا التركيز على جافا, هاسكل, و C# في هذا الجواب ، لأن هذا ما أعرفه.ما يستحق, Python, Ruby, وجافا سكريبت جميعا حصرا محاصر القيم.هذا هو المعروف أيضا باسم "كل ما هو كائن" نهج***.
*** التحذير:بما فيه الكفاية المتقدمة مترجم / JIT يمكن في بعض الحالات أن الواقع يكشف أن قيمة وهو لغويا محاصر عندما تبحث في المصدر يمكن أن يكون بأمان وهو بدون علبة قيمة في وقت التشغيل.في جوهرها ، بفضل عبقرية اللغة منفذي صناديق الخاصة بك في بعض الأحيان مجانا.
نصائح أخرى
من C# 3.0 باختصار:
الملاكمة هو قانون صب قيمة نوع إلى نوع الإشارة:
int x = 9;
object o = x; // boxing the int
علبته هو...عكس:
// unboxing o
object o = 9;
int x = (int)o;
الملاكمة & علبته هو عملية تحويل البدائية القيمة إلى كائن المنحى المجمع الدرجة (الملاكمة) ، أو تحويل قيمة من كائن المنحى المجمع الدرجة العودة إلى البدائية قيمة (علبته).
على سبيل المثال ، في جافا, قد تحتاج إلى تحويل int
القيمة في Integer
(الملاكمة) إذا كنت ترغب في تخزينه في Collection
لأن الأوليات لا يمكن تخزينها في Collection
, فقط الكائنات.ولكن عندما كنت ترغب في الحصول على العودة من Collection
قد ترغب في الحصول على قيمة لها int
لا Integer
لذا سيكون خدمة unbox ذلك.
الملاكمة و علبته ليست بطبيعتها سيئة, لكنه هو المقايضة.اعتمادا على اللغة التنفيذ ، يمكن أن يكون أبطأ وأكثر الذاكرة المكثفة من مجرد استخدام الأوليات.ومع ذلك ، قد تسمح لك أيضا استخدام أعلى مستوى هياكل البيانات و تحقيق قدر أكبر من المرونة في التعليمات البرمجية الخاصة بك.
في هذه الأيام, هو الأكثر شيوعا التي نوقشت في سياق جافا (وغيرها اللغة) "autoboxing/autounboxing" الميزة.هنا جافا التي تركز على شرح autoboxing.
في .صافي:
في كثير من الأحيان لا يمكنك الاعتماد على ما نوع من متغير وظيفة سوف تستهلك ، لذلك تحتاج إلى استخدام كائن المتغير الذي يمتد من أدنى قاسم مشترك في .صافي هذا هو object
.
ومع ذلك object
هي فئة ومخازن محتوياته كمرجع.
List<int> notBoxed = new List<int> { 1, 2, 3 };
int i = notBoxed[1]; // this is the actual value
List<object> boxed = new List<object> { 1, 2, 3 };
int j = (int) boxed[1]; // this is an object that can be 'unboxed' to an int
في حين أن كلا من هؤلاء يحملون نفس المعلومات القائمة الثانية أكبر وأبطأ.كل قيمة في القائمة الثانية هي في الواقع إشارة إلى object
الذي يحمل int
.
وهذا ما يسمى محاصر لأن int
ملفوفة من قبل object
.عندما يلقي مرة أخرى int
هو بدون علبة - تحويلها إلى قيمة.
القيمة أنواع (أيكل structs
) هذا هو بطيء ، ويحتمل أن يستخدم الكثير من الفضاء.
للإشارة أنواع (أيكل classes
) هذا هو أقل بكثير من مشكلة ، كما يتم تخزينها كمرجع على أي حال.
مشكلة أخرى مع محاصر نوع القيمة هو أنه ليس من الواضح أنك تتعامل مع مربع بدلا من القيمة.عند المقارنة بين اثنين structs
ثم هل تقارن القيم ، ولكن عند المقارنة بين اثنين classes
ثم (افتراضيا) كنت مقارنة الإشارة - أيهل هذه نفس سبيل المثال ؟
هذا يمكن أن يكون مربكا عند التعامل مع محاصر القيمة أنواع:
int a = 7;
int b = 7;
if(a == b) // Evaluates to true, because a and b have the same value
object c = (object) 7;
object d = (object) 7;
if(c == d) // Evaluates to false, because c and d are different instances
فإنه من السهل أن عمل حول:
if(c.Equals(d)) // Evaluates to true because it calls the underlying int's equals
if(((int) c) == ((int) d)) // Evaluates to true once the values are cast
ومع ذلك هو شيء آخر أن تكون حذرا عند التعامل مع محاصر القيم.
على .صافي FCL عامة مجموعات:
List<T>
Dictionary<TKey, UValue>
SortedDictionary<TKey, UValue>
Stack<T>
Queue<T>
LinkedList<T>
جميعها تهدف إلى التغلب على مشكلات الأداء الملاكمة و علبته في السابق مجموعة تطبيقات.
للحصول على المزيد ، انظر الفصل 16 ، CLR عن طريق C# (2nd Edition).
الملاكمة هي عملية تحويل قيمة من نوع إلى نوع مرجع.
علبته هو تحويل إشارة من نوع إلى نوع القيمة.
EX: int i=123;
object o=i;// Boxing
int j=(int)o;// UnBoxing
نوع القيمة هي:
int, char والهياكل ، والتعدادات.نوع الإشارة هي:دروس,واجهات,صفائف,سلاسل الكائنات
الملاكمة و علبته يسهل القيمة أنواع تعامل الكائنات.الملاكمة يعني تحويل القيمة إلى مثيل كائن مرجع نوع.على سبيل المثال ، Int
هي فئة ، int
هو نوع البيانات.تحويل int
إلى Int
هو exemplification الملاكمة ، في حين أن تحويل Int
إلى int
هو علبته.مفهوم يساعد في جمع القمامة ، علبته ، من ناحية أخرى ، تحويل كائن من نوع إلى نوع القيمة.
int i=123;
object o=(object)i; //Boxing
o=123;
i=(int)o; //Unboxing.
مثل أي شيء آخر ، autoboxing يمكن أن يكون مشكلة إذا لم تستخدم بعناية.الكلاسيكية هو في نهاية المطاف مع NullPointerException و لن تكون قادرة على تعقب عليه.حتى مع وجود المصحح.جرب هذا:
public class TestAutoboxNPE
{
public static void main(String[] args)
{
Integer i = null;
// .. do some other stuff and forget to initialise i
i = addOne(i); // Whoa! NPE!
}
public static int addOne(int i)
{
return i + 1;
}
}