هو المحاولة أخيرا أن تستخدم لماما لنفس الأسباب محاولة الصيد ؟

StackOverflow https://stackoverflow.com/questions/411012

سؤال

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

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

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

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

المحلول

أنت لا تحتاج إلى تجنب محاولة {} ...أخيرا {} نمط من الترميز.ولكن بقدر الاتصالات الخاصة بك الذهاب ، حيث أنهم IDisposable استخدام "باستخدام" بدلا من ذلك ، منذ أن يفعل نفس الشيء بالنسبة لك في أطول وأكثر تعقيدا محاولة/أخيرا كتلة.

نصائح أخرى

على سيئة شيء حول استخدام try-catch في كل مكان في استهلاك الاستثناء يحتمل إخفاء رمز سيئة.المحاولة أخيرا (بدون قبض) لا يخفي استثناءات ، ولكن لا توفر البرمجية ضمانات.في الحالة الخاصة بك ، يمكنك أن تتوقع بعض أنواع الاستثناءات حتى من تشكيل أوامر SQL (مثل محاولة إدراج صف مكررة) وبالتالي أعتقد أن استخدام أخيرا لها ما يبررها.هذا يفترض أن تشعر ، كما أفعل أنا ، أن الاتصالات يجب أن تكون قصيرة الأجل و فتح/مغلقة عند استخدامها و ليس من أجل الحياة الخاصة بك الدال.

تحرير:أود أن الثاني @ديف ماركل توصية.باستخدام كتلة هو أكثر من ذلك بكثير أنيقة و لغويا ما يعادلها.المرة الوحيدة التي قد صالح المحاولة أخيرا على استخدام لتجنب متعددة متداخلة usings في صالح واحد المحاولة أخيرا.

استخدام Try/أخيرا حيث أنه من المنطقي ، لا تحاول تحسين هذا حتى يكون لديك مشكلة بسبب هذا.

أما وقد قلت ذلك ، حاول/أخيرا ليست مكلفة كما استثناءات.بالتأكيد أنهم لا مجانا ، ولكن رمي واصطياد استثناء هو أكثر تكلفة من حاول/أخيرا كتلة.

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

وأعتقد أنه هو أفضل بكثير من ممارسة التفاف الاتصال في استخدام البيان (على افتراض الاتصال تنفذ IDisposable).أسلوب التخلص من شأنها التحقق من حالة الاتصال وإغلاق إذا لزم الأمر.

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

ومع ذلك ، حاول/أخيرا عموما لا طائل أيضا ، لأن using كتلة تحقيق نفس الشيء أكثر أناقة.

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

كتبت بلوق الدخول على كيفية التخفيف من هذا إلى حد ما في حين يعود:

http://www.levelofindirection.com/journal/2009/9/24/raii-and-readability-in-c.html

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