سؤال

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

التفاهم .صافي المشتركة نوع النظام

في ويكيبيديا هناك مثال على جافا.ولكن في C#, ما هي بعض الحالات التي يكون فيها المرء إلى مربع قيمة نوع ؟ أو أفضل/نفس السؤال ، لماذا تريد تخزين نوع قيمة على كومة (محاصر) بدلا من على كومة ؟

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

المحلول

في العام ، عادة سوف ترغب في تجنب الملاكمة القيمة الخاصة بك أنواع.

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

لا تزال هناك حالات من هذا أن تكون مفيدة في .NET 2.0+.في أي وقت كنت ترغب في الاستفادة من حقيقة أن جميع أنواع بما في ذلك أنواع قيمة, يمكن أن تعامل على أنها كائن مباشرة, قد تحتاج إلى استخدام الملاكمة/علبته.هذا يمكن أن يكون مفيد في بعض الأحيان ، حيث أنه يسمح لك بحفظ أي نوع في مجموعة (باستخدام كائن بدلا من T في جمع عام) ، ولكن في عام ، فمن الأفضل لتجنب هذا, كما كنت فقدان نوع الأمان.في حالة واحدة حيث الملاكمة كثيرا ما يحدث, رغم أن, هو عندما كنت تستخدم انعكاس - العديد من المكالمات في التفكير سوف تتطلب الملاكمة/علبته عند العمل مع أنواع قيمة ، لأن نوع غير معروف مسبقا.

نصائح أخرى

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

في الوقت الحاضر لدينا مجموعات عامة ، لذلك هذا هو أقل من قضية.

الملاكمة عموما يحدث تلقائيا في .صافي عند لديهم ؛ في كثير من الأحيان عند تمرير قيمة من نوع إلى شيء أن تتوقع نوع مرجع.مثال شائع هو السلسلة.الشكل().عند تمرير بدائية أنواع قيمة إلى هذا الأسلوب ، فهي محاصر كجزء من الدعوة.لذلك:

int x = 10;
string s = string.Format( "The value of x is {0}", x ); // x is boxed here

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

على جانبا مثيرا للاهتمام ، عند استخدام الأدوية في .صافي القيمة أنواع لا محاصر عندما تستخدم المعلمات أو أفراد النوع.مما يجعل الأدوية أكثر كفاءة من كبار السن C# كود (مثل ArrayList) التي تعالج كل شيء {وجوه} إلى نوع الملحد.وهذا يضيف اكثر من سبب واحد لاستخدام ومجموعات عامة ، مثل List<T> أو Dictionary<T,K> أكثر ArrayList أو Hashtable.

أنصح لك 2 لطيفة مواد إريك ليبرت

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

هنا هو اقتباس أني 100% أتفق مع

باستخدام مكدس على السكان المحليين من قيمة نوع هو مجرد الأمثل أن CLR يقوم نيابة عنك.ميزة ذات الصلة من القيمة أنواع أن لديهم دلالات يجري نسخ القيمة ، غير أنه في بعض الأحيان بهم deallocation يمكن أن يكون الأمثل من قبل وقت التشغيل.

في 99% من مطوري التطبيقات أن لا يهتم لما أنواع قيمة في كومة وليس في كومة وما كسب الأداء يمكن أن لدينا هنا.ناتئة في الاعتبار قواعد بسيطة جدا:

  1. تجنب الملاكمة/علبته عندما لا من الضروري استخدام الأدوية مجموعات.معظم المشاكل لا تحدث عند تعريف أنواع ، ولكن عندما استخدام القائمة أنواع inproperly (المحددة من قبل Microsoft أو وزملائك)
  2. جعل أنواع قيمة بسيطة.إذا كنت بحاجة إلى البنية مع 10-20 المجالات ، أفترض أنك'ld أفضل إنشاء فئة.تخيل كل المجالات التي سيتم نسخ في كل مرة عندما كنت أحيانا تمر عليه وظيفة من حيث القيمة...
  3. أنا لا أعتقد أنه من المفيد جدا أن يكون أنواع قيمة مع الإشارة نوع الحقول في الداخل.مثل البنية مع سلسلة حقول كائن.
  4. تحديد ما تحتاج إلى نوع اعتمادا على الوظائف المطلوبة ، وليس على المكان يجب أن يتم تخزينها.البنيات لديك وظائف محدودة مقارنة دروس, حتى إذا لا يمكن أن توفر البنية الوظائف المطلوبة ، مثل منشئ افتراضي, تعريف الطبقة.
  5. إذا كان هناك شيء يمكن القيام بأي الإجراءات مع البيانات الأخرى أنواع, وهو عادة يعرف بأنه فئة.عن البنيات العمليات مع يجب أن تكون أنواع مختلفة محددة إلا إذا كنت يمكن أن يلقي نوع واحد إلى آخر.أقول يمكنك إضافة الباحث إلى مضاعفة لأنك يمكن أن يلقي الباحث إلى مزدوجة.
  6. إذا كان هناك شيء يجب أن يكون عديم الجنسية ، ومن فئة.
  7. عندما كنت متردد في استخدام أنواع المراجع.:-)

أي قواعد يسمح الاستثناءات في حالات خاصة, ولكن لا تحاول الإفراط في الأمثل.

p.s.التقيت بعض ASP.NET المطورين مع 2-3 سنوات الخبرة الذين لا يعرفون الفرق بين كومة كومة.:-( لن تأجير مثل هذا الشخص إذا أنا المقابلة ، ولكن ليس بسبب الملاكمة/علبته يمكن أن يكون عنق الزجاجة في أي من ASP.NET مواقع رأيت من أي وقت مضى.

أعتقد مثال جيد الملاكمة في c# يحدث في غير عام مجموعات مثل ArrayList.

ومن الأمثلة على ذلك عندما يأخذ طريقة كائن المعلمة و نوع القيمة يجب أن يتم تمريرها في.

وفيما يلي بعض الأمثلة على الملاكمة/علبته

ArrayList ints = new ArrayList();
myInts.Add(1); // boxing
myInts.Add(2); // boxing

int myInt = (int)ints [0]; // unboxing

Console.Write("Value is {0}", myInt); // boxing

واحدة من الحالات عندما يحدث هذا على سبيل المثال إذا كان لديك الطريقة التي تتوقع المعلمة من نوع كائن و أنت تمر في واحدة من أنواع بدائية ، الباحث على سبيل المثال.أو إذا كنت تحدد المعلمة " ref " من نوع int.

رمز

int x = 42;
Console.Writeline("The value of x is {0}", x );

في الواقع صناديق unboxes لأن Writeline لا int يلقي في الداخل.لتجنب هذا يمكنك فعله

int x = 42;
Console.Writeline("The value of x is {0}", x.ToString());

حذار من البق خفية!

يمكنك أن تعلن القيمة الخاصة بك أنواع بإعلان نوع الخاصة بك كما struct.تخيل أنك تعلن struct مع الكثير من الخصائص ومن ثم وضع بعض الحالات داخل ArrayList.هذا مربعات لهم بالطبع.الآن مرجعية واحدة خلال [] مشغل الصب إلى نوع تعيين خاصية.يمكنك فقط تعيين الخاصية على نسخ.واحد في ArrayList لا يزال غير معدلة.

لهذا السبب, أنواع القيم يجب أن تكون دائما ثابتة ، أيجعل جميع الأعضاء المتغيرات readonly بحيث لا يمكن إلا أن تكون مجموعة في منشئ وليس لديهم أي قابلة للتغيير أنواع كأعضاء.

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