2016-05-05 1 views
1

(wenn nicht „Verwendung“ verwendet wird) Abgesehen ob es sich um eine schreckliche schreckliche Idee ist IDisposable auf einem Nicht-Referenztyp je zu implementieren, würde die Dispose() Methode aufgerufen werden, wenn ein Nicht-Referenz IDisposable wird vom Stapel entfernt?Does IDisposable auf Stapel Gegenstände wie struct gecallt

+0

Nein ich meine IDisposable.Dispose –

+2

Warum in aller Welt möchten Sie IDisposable struct? – dotctor

+0

Kanonischer Link: https://ericlippert.com/2011/03/14/to-box-o-not-to-box/ – stuartd

Antwort

3

Die Antwort lautet: nein,

Lediglich eine Struktur zu schaffen, die auf dem Stapel lebt, wird nicht dazu führen, Dispose() aufgerufen werden, wenn es den Gültigkeitsbereich verlässt. (Natürlich, noch wird, die für eine Klasse passieren.)

Dispose() wird nur dann aufgerufen werden, wenn sie ausdrücklich genannt wird, oder wenn es implizit durch ein using genannt wird.

jedoch Dispose()wird aufgerufen werden, wenn eine Struktur IDisposable implementiert und ist im Inneren ein benutztes verwendet, etwa so:

using System; 

namespace Demo 
{ 
    struct Test: IDisposable 
    { 
     public void Dispose() 
     { 
      Console.WriteLine("Help! Help! I'm being oppressed!"); 
     } 
    } 
    static class Program 
    { 
     static void Main() 
     { 
      using (var test = new Test()) 
      { 
       Console.WriteLine("Using a Test object"); 
      } 
     } 
    } 
} 

Diese gibt

Using a Test object 
Help! Help! I'm being oppressed! 

Beachten Sie, dass structs im Allgemeinen dazu bestimmt sind, Leichtgewichtig sein und sollte keine Referenzen enthalten (außer vielleicht für Strings). In diesem Fall sollte ein Struct nichts Wegwerfbares enthalten, daher würde diese Frage nicht auftreten.

+0

Der OP fragt, ob es entsorgt wird, wenn er es nicht selbst entsorgt, nicht wenn es entsorgt wird, wenn er es entsorgt. – Servy

+0

@Servy Gib mir eine Minute, ich schreibe immer noch die Antwort :) –

+4

Wenn Sie nicht mit Ihrer Antwort fertig waren, sollten Sie es nicht gepostet haben. – Servy