จะ Dispose () ถูกเรียกใช้ใน statement ที่ใช้กับวัตถุ null หรือไม่?


179

มีความปลอดภัยในการใช้usingคำสั่งบนวัตถุ (อาจ) null หรือไม่?
ลองพิจารณาตัวอย่างต่อไปนี้:

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

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

มันรับประกันว่าDisposeจะถูกเรียกเฉพาะในกรณีที่วัตถุไม่เป็นโมฆะและฉันจะไม่ได้รับ a NullReferenceException?


คำตอบ:


172

ใช่Dispose()มีการเรียกเฉพาะกับวัตถุที่ไม่เป็นโมฆะ:

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


30
โปรดทราบว่าแม้ว่าตัวแปรของคุณจะเป็นโมฆะ แต่บล็อกการใช้จะถูกดำเนินการและหากคุณอ้างอิงตัวแปรภายในบล็อกการใช้โดยไม่ตรวจสอบค่า null แรกคุณจะได้รับ NullReferenceException เพื่อป้องกันการตีความที่ผิดคำตอบนี้ควรระบุว่า: "ใช่Dispose()มีการเรียกเฉพาะกับวัตถุที่ไม่มีค่าว่าง"
ท่อง

37

การขยายตัวของการusingตรวจสอบว่าวัตถุไม่ได้nullก่อนที่จะเรียกDisposeมันดังนั้นใช่มันปลอดภัย

ในกรณีของคุณคุณจะได้รับสิ่งที่ชอบ:

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

14

คุณควรจะตกลงกับมัน:

using ((IDisposable)null) { }

ไม่มีข้อยกเว้นโยนที่นี่

หมายเหตุด้านข้าง: อย่าเข้าใจผิดเกี่ยวกับสิ่งนี้foreachและIEnumerableข้อยกเว้นจะถูกโยนทิ้ง


1

ใช่ก่อนที่จะทิ้งการอ้างอิงจะถูกตรวจสอบเป็นโมฆะ คุณสามารถตรวจสอบตัวเองโดยดูรหัสของคุณในตัวสะท้อนแสง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.