2017-04-01 20 views
1

我有這樣一段代碼:訪問實例不受IDisposable的用戶代碼中引用到「使用」語句

using(var a = myFunction()){ 

    a.Process(); 

} 

有一些方法(在上面的示例中a)來引用不定義的實例進using聲明?

我的意思是,寫一些像:

using(myFunction()){ 

    [Reflection?, another stuff?].Process(); 

} 

[Reflection?, another stuff?]應該是相當於a

的實例(由myFunction()返回的值)存在進入using範圍,我相信,因爲該方法的IDisposableDispose()正確解僱。

一些線索?

+0

這是一個XY問題的怪胎。你究竟在做什麼*試圖完成什麼? – BradleyDotNET

+0

當然,如果你只是想參考認爲在堆棧上。但我不認爲c#是這樣的。這不是_assembler_ – MickyD

+0

嗨布拉德利,我正在寫一段代碼來記錄一些過程,我很好奇這個話題。我知道實例存在於作用域中,因爲Dispose()方法被觸發,但是...可以在沒有聲明的情況下訪問它? –

回答

1

如果你想使用myFunction的結果,你應該通過聲明一個變量來使用它。

myFunction可能會返回null。您可以將Process定義爲返回值類型myFunction的擴展方法。這樣你可以忽略null而不會得到任何空引用異常。

+0

是的,100%同意你Daniel但是,我很想知道myFunction()的結果存在於範圍中的「where」有可能以其他方式訪問它。謝謝。 –

+2

@SebastiánGuerrero編譯器將其隱藏在臨時變量中。 –

+0

那麼,那個臨時變量超出了c#/ .Net運行時環境的範圍? –

1

我想你可以把最後創建的實例放在一個靜態字段中。我希望你不想同時多次這樣做。

static void Main(string[] args) 
{ 
    using (myFunction()) 
    { 
     myClass.LastInstance.Process(); 
    } 
    Console.ReadLine(); 
} 
static myClass myFunction() 
{ 
    return new myClass(); 
} 
class myClass : IDisposable 
{ 
    public static myClass LastInstance; 
    public myClass() 
    { 
     Console.WriteLine("constructor"); 
     LastInstance = this; 
    } 
    public void Dispose() { Console.WriteLine("dispose"); } 
    public void Process() { Console.WriteLine("process"); } 
} 
+0

創造性的解決方案! –