簡體   English   中英

使用block:將對象初始化編譯成try塊

[英]Using block: object initialization compiled into try block

在我的項目中,我有一個構造函數可以拋出的對象。 所以我正在使用的代碼如下:

MyObject obj = null;
try
{
    obj = new MyObject();
    obj.DoSomething();
}
finally
{
    if (obj != null)
        obj.Free();
}

正如在C#使用“使用”一樣,代碼就像

using (MyObject obj = new MyObject())
{
    obj.DoSomething();
}

由.NET CLR轉換為

{
    MyObject obj = new MyObject();
    try
    {
        obj.DoSomething();
    }
    finally
    {
        if (obj != null)
            ((IDisposable)obj).Dispose();
    }
}

問題是:我可以以某種方式使CLR將對象的構造函數放入try塊中嗎?

問題是:我可以以某種方式使CLR將對象的構造函數放入try塊中嗎?

不,或者說,從資源管理的角度來看,這樣做毫無意義。 如果構造函數拋出異常,那么就不會有一個分配給obj的引用,所以沒有什么可以調用Dispose

至關重要的是,如果構造函數拋出異常,它會處理它分配的任何資源,因為調用者將無法執行。

不,你不能這樣做,這是using ,它以這種方式工作。 您必須自己編寫所需的代碼

值得一提的是,在類型的ctor中有異常,根本不是一個好主意,所以如果可能的話,可能會將可能引發異常的代碼移動到另一個地方。 最好還有一個方法,並限制你的類型的消費者明確地調用它來實現某些事情並控制情況,然后像你描述的情況那樣。

通常,使用ctor僅用於構造給定類型的實例和內部值的初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM