سؤال

أنا أبحث عن واضحة وموجزة ودقيقة الإجابة.

بطبيعة الحال الإجابة الفعلية ، على الرغم من وصلات إلى تفسيرات جيدة موضع ترحيب.

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

المحلول

محاصر القيم هياكل البيانات التي هي الحد الأدنى مغلفة حول أنواع بدائية*.محاصر القيم يتم تخزينها عادة مؤشرات الكائنات على كومة.

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

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

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

* في هذه المناقشة, بدائية قيمة أي التي يمكن تخزينها على مكدس الاستدعاءات, بدلا من تخزينها على شكل المؤشر إلى قيمة على كومة.في كثير من الأحيان هذا مجرد آلة أنواع (رجات, العوامات, الخ), البنيات, و في بعض الأحيان ثابت الحجم المصفوفات..صافي-أرض يدعو لهم أنواع قيمة (بدلا من أنواع المراجع).جافا الناس ندعو لهم أنواع بدائية.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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top