
import System;
import System.IO;



class objectDisposedException extends System.ApplicationException {
	function objectDisposedException() { }
	function objectDisposedException(s:String) {
		super(s);
	}
	function objectDisposedException(s:String,e:Exception) {
		super(s,e);
	}
	
}

class sampleTempFile extends Object {

	var theFile :String ;
	var isDisposed : Boolean;
	
	function sampleTempFile() {
		theFile = Path.GetTempFileName();
		isDisposed=false;
	}
	
	function get fileName() : String {
		return theFile;
	}
	function Write(s:String) {
		if (isDisposed) throw new objectDisposedException();
		Console.WriteLine("Wywołanie Write({0})",s);
	}
	
	function Read() : String {
		if (isDisposed) throw new objectDisposedException();
		return "Wywołanie Read()";
	}
   function Dispose() {
      Console.WriteLine("Wywołanie Dispose()");
      Dispose(true);
      isDisposed=true;
   }

   function Close() {
      Console.WriteLine("Wywołanie Close()");
      this.Dispose();
   }

   protected function Finalize() {
		isDisposed=true;
      Console.WriteLine("Wywołanie Finalize()");
      Dispose(true);
   }

   private function Dispose( disposing: Boolean ) {
      Console.WriteLine("Wywołanie Dispose(" + disposing.ToString() + ")");

	  try { 
		if (disposing) { 
			Console.WriteLine("Dispose: Teraz usuwamy obiekty");
		}
	  }	
	  catch(e:Exception) {
	     
	     // przechwytujemy wszystko...nic nie robimy
	  }
	  finally {

		// Jeżeli trzeba, usuwamy obiekt bazowy...
		// super.Dispose(disposing);

		// ponieważ obiekt this został usunięty, nie ma potrzeby, aby GC
		// wywoływał metodę Finalize. Następna instrukcja nakazuje 
		// pominąć Finalize()...
		GC.SuppressFinalize(this);
		Console.WriteLine("Dispose: zakończone");		
      }
   }

}


var tempFile : sampleTempFile = new sampleTempFile();

Console.WriteLine("Nazwa pliku tymczasowego to: {0}",tempFile.fileName);
tempFile.Write("Test1");
Console.WriteLine(tempFile.Read());
//tempFile.Close();




/** Dane wyjściowe...
Przy pierwszej próbie wiersz tempFile.Close() jest wyłączony (jako komentarz). GC (mechanizm odśmiecania) wywołał metodę Finalize wraz z zakończeniem programu.

Nazwa pliku tymczasowego to: f:\tmp\tmpBA.tmp
Wywołanie Write(Test1)
Wywołanie Read()
Wywołanie Finalize()          <-************
Wywołanie Dispose(True)
Dispose: Teraz usuwamy obiekty
Dispose: zakończone

W drugiej próbie wiersz tempFile.Close() został zachowany. W tym przypadku GC nie wywołał metody Finalize(), ponieważ Dispose() poinformowała, że nie jest to konieczne, bo usunęła już zasoby wywołaniem Close().

Nazwa pliku tymczasowego to: f:\tmp\tmpB4.tmp
Wywołanie Write(Test1)
Wywołanie Read()
Wywołanie Close()
Wywołanie Dispose()
Wywołanie Dispose(True)
Dispose: Teraz usuwamy obiekty
Dispose: zakończone
**/
