لماذا يقوم الفصل بتنفيذ idisposable بشكل صريح بدلاً من الضمني؟

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

سؤال

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

// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();

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

نصائح أخرى

  • في بعض الأحيان ، سيكون لدى الفصل طريقة تصرف جزء من الواجهة ولكن لا تحتاج فعليًا إلى استدعاءها لأن المورد الوحيد الذي يجب التخلص منه هو الذاكرة: 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, ، لكنه ممكن.

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