سؤال

وأنا أعلم أن الملاكمة هو مفهوم شعبية مع الكثير من المعلومات المتاحة على ذلك, ولكن لدي بعض الأسئلة التي لا أستطيع حقا أن تجد إجابات على:

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

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

1) http://en.csharp-online.net/Classes, البنيات, والكائنات الملاكمة و علبته

2) http://dotnetperls.com/Content/Struct-Examples.aspx

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

شكرا (المحتملة) التعليم إلى جميع الملصقات!يرجى عذر أي احتمال سذاجة.تعلم الداخلية يأخذ مني بلطف أن قضاء بعض الوقت على فهم IL, الخ (شيء لمعالجة قريبا).

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

المحلول

إذا كنت لم تمر على نوع القيمة إلى متغير مرجع ثم الملاكمة لن يحدث.عندما كنت لا تعرف ثم الإجابة التالية الأسئلة:

  • تصرف مثل أنواع بدائية.
  • لها مثيل الحجم تحت 16 بايت.
  • غير قابلة للتغيير.
  • قيمة دلالات المرغوب فيه.

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

نصائح أخرى

يجب عليك استخدام أنواع قيمة لأنه من المنطقي المنفعة لا المكاسب الأداء.أن يقال, لأن القيمة أنواع تدار على المكدس ، لا تحتاج إلى المشاركة في جمع القمامة.إذا كان لديك النوع الذي يتم إنشاء باستمرار و التخلص منها (مثل int, float, double, الخ), ثم يمكنك الحصول على دفعة جيدة من خلال تحويل هذه البنيات.الشيء أن تكون حذرا من أن يجب عليك فقط أن تنظر حقا هذا إذا كان يمكنك أيضا جعل البنية غير قابل للتغيير.

بضعة أشياء أخرى للنظر -

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

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

هذا شيء يستحق الاهتمام إذا كان الأداء هو جزء مهم من التطبيق الخاص بك.على سبيل المثال ، في واحدة من بلدي تطبيقات تغيير نوع واحد من فئة إلى البنية حلق 40 ٪ منذ فترة طويلة (>5 دقيقة وقت التشغيل) عملية.وجود كائنات قريبة من بعضها البعض في الذاكرة إذا كنت تستخدم لهم مرارا وتكرارا في الثقيلة الرياضيات الحسابية يمكن أن توفر مكاسب ضخمة.

الآن - في حالة وجود 2 سلاسل التاريخ والوقت ربما لن نرى أي تحسينات من هذا.نوع من الروتينية التي من شأنها أن تعمل على سلاسل وربما لا يفعل الثقيلة حساب (أمل) ، أي:وتحويل نصف مليون نقطة في الفضاء ، أو القيام كبير مصفوفة الحل ، إلخ.

وأخيرا - ستلاحظ ذلك .net3.5sp1 جعل البنيات أكثر فائدة.قبل 3.5sp1 (على x86) ، لم يكن هناك أي مصدر من الأساليب مع البنية المكالمات.هذا المحدودة أداء قدر ممكن من المكاسب عبر البنيات.تحديث الإطار الخاص بك يمكن أن تجعل القديمة البنية البرمجية بكثير وأسرع بكثير (في بعض الحالات).

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

أنواع قيمة أعلن سبيل المثال سوف يكون أعضاء في الذاكرة حتى الكائن
حذف من قبل مجلس الإدارة.

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

GC يعمل من تلقاء نفسه وفي معظم الأحيان يجب أن تترك وحدها.
لا يمكنك التنبؤ عندما كائن سيكون حذفها من قبل مجلس الإدارة.

التخلص نمط استخدامها على أنواع المراجع ولكن لن تجبر GC حذف
كائن.انها عادة ما تستخدم لتحرير الموارد غير المدارة.

من أجل القيم في كومة النظر في ما يلي:
دعونا نقول لديك برنامج بسيط مع ثلاث طرق ، مثل أدناه:
عندما يكون هذا البرنامج هو تشغيل الأسلوب الرئيسي هو تشغيل وهلم جرا.يرجى اتباع
الأرقام أدناه:


Main
{
   // (0) Stack is empty
   int firstInt = 0;
   // (1) Stack now contains:
   //                     firstInt
   DoSomething1();
   // (7) Stack still contains:
   //                     firstInt
}
// Program ends

DoSomething()
{
   int anInteger = 0; 
   // (2) Stack now contains:
   //                    anInteger
   //                    firstInt
   DoMore()
   // (5) Stack now contains:
   //                     anInteger
   //                     firstInt
}
// (6) anInteger goes out of scope

DoMore
{
  int anotherInteger = 1; 
   // (3) Stack now contains:
   //                     anotherInteger
   //                     anInteger
   //                     firstInt
}
// (4) anotherInteger goes out of scope

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