নাল বস্তুর সাথে ব্যবহারের বিবৃতিতে ডিসপোজ () ডাকা হবে?


178

usingএকটি (সম্ভাব্য) নাল বস্তুর উপর বিবৃতিটি ব্যবহার করা কি নিরাপদ ?
নিম্নলিখিত উদাহরণ বিবেচনা করুন:

class Test {
    IDisposable GetObject(string name) {
        // returns null if not found
    }

    void DoSomething() {
        using (IDisposable x = GetObject("invalid name")) {
            if (x != null) {
                 // etc...
            }
        }
    }
}

এটি কি গ্যারান্টিযুক্ত যে Disposeকেবল তখনই ডাকা হবে যখন অবজেক্টটি শূন্য না হলে এবং আমি একটি পাব না NullReferenceException?


উত্তর:


171

হ্যাঁ, Dispose()কেবল নন-নাল বস্তুগুলিতে ডাকা হয়:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx


30
মনে রাখবেন যে আপনার ভেরিয়েবলটি নাল হলেও, ব্যবহারের ব্লকটি কার্যকর হয় এবং আপনি যদি প্রথমে নাল-চেক না করে ব্যবহারের ব্লকের অভ্যন্তরে আপনার ভেরিয়েবলটি উল্লেখ করেন তবে আপনি নুলারফেরান এক্সেপশন পাবেন। ভুল ব্যাখ্যা রোধ করতে, এই উত্তরে বলা উচিত: "হ্যাঁ, Dispose()কেবল নন-নাল বস্তুগুলিতে ডাকা হয়"।
সার্ফেন

36

usingচেকগুলির জন্য সম্প্রসারণ যে বস্তুটি nullফোন Disposeকরার আগে তা নয়, তাই হ্যাঁ, এটি নিরাপদ।

আপনার ক্ষেত্রে আপনি এই জাতীয় কিছু পাবেন:

IDisposable x = GetObject("invalid name");
try
{
    // etc...
}
finally
{
    if(x != null)
    {
        x.Dispose();
    }
}

14

আপনার এটির সাথে ভাল হওয়া উচিত:

using ((IDisposable)null) { }

ব্যতিক্রম এখানে নিক্ষিপ্ত।

পার্শ্ব নোট: এটির সাথে ভুল করবেন না foreachএবং IEnumerableযেখানে ব্যতিক্রম ছুঁড়ে ফেলা হবে।


1

হ্যাঁ, ডিসপোজ করার আগে রেফারেন্সটি নাল-চেক করা হবে। আপনি প্রতিচ্ছবিতে আপনার কোড দেখে নিজেকে পরীক্ষা করতে পারেন।


-3

আমার অভিজ্ঞতা অনুসারে আপনি নাল রেফারেন্স ব্যতিক্রম পাবেন না। এটি কেবল উপেক্ষা করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.