যখন কোনও ব্যবহারের বিবৃতিটির অভ্যন্তরে ব্যতিক্রম ছুঁড়ে ফেলা হয় তখনও কি ডিসপোজ কল করা হবে?


105

নীচের উদাহরণে, কোনও usingবিবৃতিতে থাকলে যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তখন কি সংযোগটি বন্ধ হয়ে যায় এবং নিষ্পত্তি হয় ?

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    // stuff happens here and exception is thrown...
}

আমি জানি যে নীচের এই কোডটি এটি নিশ্চিত করে তুলবে, তবে বিবৃতিটি কীভাবে এটি ব্যবহার করে তা আমি আগ্রহী।

var conn;
try
{
    conn = new SqlConnection("...");
    conn.Open();
    // stuff happens here and exception is thrown...
}
// catch it or let it bubble up
finally
{
    conn.Dispose();
}

সম্পর্কিত:

কোনও ব্যতিক্রম নিক্ষেপ করা হলে এসকিউএল সংযোগ বন্ধ হওয়ার বিষয়টি নিশ্চিত করার সঠিক উপায় কী?

উত্তর:


113

হ্যাঁ, usingআপনার কোডটিকে একটি চেষ্টা / শেষ অবধি ব্লক করে যেখানে finallyঅংশটি Dispose()উপস্থিত থাকলে কল করবে । এটি Close()সরাসরি কল করবে না কারণ এটি কেবলমাত্র IDisposableইন্টারফেসটি প্রয়োগ করা হচ্ছে এবং সুতরাং Dispose()পদ্ধতিটি পরীক্ষা করে।

আরো দেখুন:


5
কেবল সংযোগের ক্লাসগুলি চিহ্নিত করার জন্য যদি আপনি তাদের উপর প্রতিফলক হন তবে আপনি দেখতে পাবেন ডিসপোজ () প্রকৃতপক্ষে অভ্যন্তরীণভাবে ক্লোজ () বলে। যদি এটি একটি অবস্থায় থাকে তবে এটি পারে।
ক্রিস মেরিসিক

4
আপনি সঠিক, এটা আছে। যাইহোক, আমি ইচ্ছাকৃতভাবে এটি উল্লেখ করিনি কারণ আইডিস্পোজেবল বা সম্পর্কিত প্যাটার্নের সাথে এর কোনও যোগসূত্র রয়েছে তা ভাবার জন্য আমি কাউকে বিভ্রান্ত করতে চাইনি। এই নির্দিষ্ট বাস্তবায়নটি ক্লোজ () বলে অভিহিত করার বিষয়টি বাস্তবায়নের বিশদ, প্যাটার্ন নয়।
জেফ ইয়েটস

4
ডকুমেন্টেশন ব্যবহার করে এমএসডিএনও এই উত্তরটির সত্যতা নিশ্চিত করে
ব্রডব্যান্ড

20

আপনার কোড দ্বারা উত্পাদিত আইএলকে এভাবেই প্রতিফলকগুলি ডিকোড করে:

ব্যক্তিগত স্ট্যাটিক শূন্যস্থান প্রধান (স্ট্রিং [] আরোগুলি)
{
    SqlConnication সংযোগ = নতুন স্কেল সংযোগ ("...");
    চেষ্টা করুন
    {
        conn.Open ();
        ডো স্টাফ ();
    }
    শেষ পর্যন্ত
    {
        যদি (সংযোগ! = নাল)
        {
            conn.Dispose ();
        }
    }
}

সুতরাং উত্তর হ্যাঁ, এটি সংযোগ বন্ধ হবে যদি

ডো স্টাফ ()
একটি ব্যতিক্রম নিক্ষেপ


সংযোগ করুন যোগ করুন। ওপেন () একটি ব্যতিক্রম ছোঁড়ে। : ডি
জেফ ইয়েটস

হ্যা অবশ্যই. যদি ক্লজটি ব্যবহারের ক্লজটির পরে যা কিছু থাকে তবে ব্যতিক্রম ছুঁড়ে মারলে সংযোগটি বন্ধ হয়ে যাবে। "নতুন স্ক্যেলকনেকশন (...)" ছুড়ে দিলে শেষ অবধি কার্যকর করা হবে না, তবে সেই ক্ষেত্রে আপনার কাছে বন্ধ হওয়ার পক্ষে আসলে একটি বৈধ ওপেন সংযোগ নেই। সুতরাং এটি ঠিক আছে।
ফ্লোরিন সাবাউ

-1

নিষ্পত্তি () এই কোডে কল করা হবে না।

class Program {
    static void Main(string[] args) {
        using (SomeClass sc = new SomeClass())
        {
            string str = sc.DoSomething();
            sc.BlowUp();
        }
    }
}

public class SomeClass : IDisposable {
    private System.IO.StreamWriter wtr = null;

    public SomeClass() {
        string path = System.IO.Path.GetTempFileName();
        this.wtr = new System.IO.StreamWriter(path);
        this.wtr.WriteLine("SomeClass()");
    }

    public void BlowUp() {
        this.wtr.WriteLine("BlowUp()");
        throw new Exception("An exception was thrown.");
    }

    public string DoSomething() {
        this.wtr.WriteLine("DoSomething()");
        return "Did something.";
    }

    public void Dispose() {
        this.wtr.WriteLine("Dispose()");
        this.wtr.Dispose();
    }
}

এটি কি ওপি প্রশ্নের উত্তর দেয় ??
জ্যো ফিলিপস

হ্যাঁ. উত্তর না হয়। নিষ্পত্তি () সংযুক্ত কোডে কল হয় না। আরও নিক্ষেপ করা ব্যতিক্রমগুলি পরিচালনা করা হয় না এবং প্রোগ্রামটি আপ হয় s
চাদ

আপনি অবশ্যই ভুল ফাইলটি দেখছেন। "ডিসপোজ ()" আপনার অস্থায়ী ফাইলটিতে লিখিত হয়। কেউ দাবি করে না যে একটি ব্যবহার-ব্লক একটি ব্যতিক্রম পরিচালনা করবে। এটি কোনও ডিবাগার ছাড়াই চালানোর চেষ্টা করুন।
লার্সটেক

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