لماذا يقوم الفصل بتنفيذ idisposable بشكل صريح بدلاً من الضمني؟
-
30-09-2019 - |
سؤال
كنت أستخدم FTPWebResponse الفصل ولم ير طريقة التخلص. اتضح أن الفصل ينفذ قابلاً للتطبيق ، ولكنه يفعل ذلك بشكل صريح بحيث يجب عليك أولاً إلقاء مثيلك على idisposable قبل الاتصال بالتخلص منها:
// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();
لماذا يختار مصمم فئة مثل هذا الفكرة تنفيذ idisposable بشكل صريح؟ كما يقول أنتوني بيغرام, ، إن القيام بالأشياء بهذه الطريقة يخفي حقيقة أنه ينبغي التخلص من الكائن للمطور العادي الذي لا يستشير الوثائق في كل مرة يستخدم فيها فئة.
المحلول
يتم ذلك عادة إذا كان لدى الفصل Close
الطريقة التي هي بالضبط مثل Dispose
. الأصلي Dispose
يتم إخفاءه في تطبيق صريح بحيث لا تحتوي الطريقة نفسها بالضبط على اسمين.
يوصى به رسميًا هنا:
النظر في تنفيذ أعضاء الواجهة بشكل صريح لإخفاء عضو وإضافة عضو مكافئ يحمل اسمًا أفضل.
(PS أنا لا أتفق مع هذه الاتفاقية.)
نصائح أخرى
- في بعض الأحيان ، سيكون لدى الفصل طريقة تصرف جزء من الواجهة ولكن لا تحتاج فعليًا إلى استدعاءها لأن المورد الوحيد الذي يجب التخلص منه هو الذاكرة: MemoryStream ، على سبيل المثال.
- كما ذكر الآخرون ، إذا كان لدى الفصل طريقة وثيقة تفعل نفس الشيء مثل التخلص من التخلص ، يمكن القول إنه يجب أن يكون التخلص فقط لدعم نمط "استخدام" بحيث يكون صريحًا أيضًا.
إنه أمر غريب بعض الشيء يبحث عني أيضًا. لما يستحق: طبقة الفئة الأساسية (WebResponse) تنفذ طريقة قريبة (). يوضح Reflector أن طريقة WebResponse Dispose () تستدعي فقط Close () و Virtual داخليًا لا يفعل شيئًا.
لا بد لي من الاعتراف بأنها تنبعث منه رائحة بعض الشيء بالنسبة لي ، لكنني أراهن أنهم نفذوا بشكل صريح قابلاً للتطبيق حتى لا يكون هناك ارتباك في Intellisense بين استدعاء Close () أو التخلص ().
بالإضافة إلى ما قيل ، قد أقترح التنفيذ IDisposable
يشجع صراحة استخدام using
كتلة ، حيث يمكن استخدامها على أي نوع ينفذ IDisposable
ومن الطبيعي (لمعظم الناس ، على أي حال) كتابة هذا:
using (var response = GetResponse())
{
// do something
}
من هذا:
var response = GetResponse();
// do something
((IDisposable)response).Dispose();
لست متأكدًا من أن هذا سيكون نية المطور في التنفيذ بشكل صريح IDisposable
, ، لكنه ممكن.