ما هو C# باستخدام الكتلة ولماذا يجب أن أستخدمه؟ [مكرر
-
03-07-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
- ما هي استخدامات "استخدام" في C# 29 إجابات
ما هو الغرض من استخدام الكتلة في C#؟ كيف يختلف عن متغير محلي؟
المحلول
إذا كان النوع ينفذ قابلاً للتخلص من ذلك ، فإنه يتخلص منه تلقائيًا.
معطى:
public class SomeDisposableType : IDisposable
{
...implmentation details...
}
هذه مكافئة:
SomeDisposableType t = new SomeDisposableType();
try {
OperateOnType(t);
}
finally {
if (t != null) {
((IDisposable)t).Dispose();
}
}
using (SomeDisposableType u = new SomeDisposableType()) {
OperateOnType(u);
}
والثاني أسهل في القراءة والصيانة.
نصائح أخرى
Using
المكالمات Dispose()
بعد using
-بقي -يترك ، حتى لو كان الكود يلقي استثناء.
لذلك عادة ما تستخدم using
بالنسبة للدروس التي تتطلب التنظيف من بعدها ، مثل IO.
لذلك ، هذا باستخدام الكتلة:
using (MyClass mine = new MyClass())
{
mine.Action();
}
سيفعل نفس:
MyClass mine = new MyClass();
try
{
mine.Action();
}
finally
{
if (mine != null)
mine.Dispose();
}
استخدام using
هو وسيلة أقصر وأسهل للقراءة.
من MSDN:
C#، من خلال .NET Framework Common Language Runtime (CLR) ، يطلق تلقائيًا الذاكرة المستخدمة لتخزين الكائنات التي لم تعد مطلوبة. إصدار الذاكرة غير محدد. يتم إصدار الذاكرة كلما قرر CLR إجراء جمع القمامة. ومع ذلك ، من الأفضل عادة إصدار موارد محدودة مثل مقابض الملفات واتصالات الشبكة في أسرع وقت ممكن.
يتيح البيان باستخدام المبرمج تحديد متى يجب أن تصدر الكائنات التي تستخدم الموارد. يجب أن ينفذ الكائن المقدم للبيان باستخدام واجهة Idisposable. توفر هذه الواجهة طريقة التصرف ، والتي يجب أن تصدر موارد الكائن.
وبعبارة أخرى ، using
يخبر البيان .NET بإصدار الكائن المحدد في using
كتلة بمجرد أن لا تكون هناك حاجة إليها.
يتم استخدام العبارة باستخدام العمل مع كائن في C# يقوم بتنفيذ IDisposable
واجهه المستخدم.
ال IDisposable
الواجهة لها طريقة عامة واحدة تسمى Dispose
الذي يستخدم للتخلص من الكائن. عندما نستخدم العبارة باستخدام ، لا نحتاج إلى التخلص من الكائن بشكل صريح في الكود ، فإن العبارة باستخدام يعتني به.
using (SqlConnection conn = new SqlConnection())
{
}
عندما نستخدم الكتلة أعلاه ، يتم إنشاء الكود داخليًا على هذا النحو:
SqlConnection conn = new SqlConnection()
try
{
}
finally
{
// calls the dispose method of the conn object
}
لمزيد من التفاصيل اقرأ: فهم بيان "استخدام" في C#.
لاحظ أيضًا أن الكائن الذي تم إنشاؤه عبر using
يقرأ فقط داخل الكتلة باستخدام. الرجوع إلى المرجع C# الرسمي هنا.
يضمن وضع الكود في كتلة استخدام التخلص من الكائنات (وإن لم يتم جمعها بالضرورة) بمجرد أن يترك التحكم الكتلة.
using (B a = new B())
{
DoSomethingWith(a);
}
يعادل
B a = new B();
try
{
DoSomethingWith(a);
}
finally
{
((IDisposable)a).Dispose();
}
إنه في الحقيقة مجرد بعض السكر البنيء الذي لا يتطلب منك التخلص من استدعاء التورط على الأعضاء الذين ينفذون idisposable.
يحصل العبارة باستخدام موارد واحدة أو أكثر ، وتنفيذ بيان ، ثم التخلص من المورد.