private static bool DisposeClassTest() { using (var disposeClass = new DisposeClass()) { Console.WriteLine($@"DisposeClass test: {disposeClass}"); } return(DisposeClass.DisposedFlag); }
private void Main() { //DisposableTestFunc(); Create(); Console.WriteLine("After created"); CallGC(); //如上运行的结果如下: //After created! //Destructor called! //结论: //显然在出了Create函数外,myClass对象的析构函数没有被立刻调用,而是等显示调用GC.Collect才被调用。 //对于Dispose来说,也需要显示的调用,但是对于继承了IDisposable的类型对象可以使用using这个关键字,这样对象的Dispose方法在出了using范围后会被自动调用。例如: using (DisposeClass t = new DisposeClass()) { } //如上运行的结果如下: ///Dispose called }
public static void ApplicationStart( Func <Form> newForm, CultureInfo culture, bool isSingle, string mutexName) { // catchされなかった例外を処理するためのイベントハンドラを追加 // ThreadExceptionのイベントハンドラ(UIスレッドでcatchされなかった例外用) Application.ThreadException += new ThreadExceptionEventHandler(Handling_ThreadException); // UnhandledExceptionのイベントハンドラ(UIスレッド以外のでcatchされなかった例外用) Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Handling_UnhandledException); // 言語の設定 if (culture != null) { Thread.CurrentThread.CurrentUICulture = culture; } // NULLチェック if (newForm == null) { throw new ArgumentNullException(nameof(newForm)); } else if (isSingle && string.IsNullOrWhiteSpace(mutexName)) { throw new ArgumentNullException(nameof(mutexName)); } // アプリケーションの実行 bool hasMutexOwnership = false; Mutex mutex = null; try { // 二重起動防止用のMutexオブジェクトを所有権を取得する形式で生成 // 二重起動を防止しない場合は生成しない if (isSingle) { mutex = new Mutex(true, mutexName, out hasMutexOwnership); } // 二重起動を防止する場合かつ、Mutexの所有権が得られない場合は既に起動済みと判断し終了する if (isSingle && !hasMutexOwnership) { Utility.MessageBox.ShowAttention(ErrorMessage.DoubleStartupImpossibleMessage); return; } while (true) { // 言語の変更プロパティをリセット ChangeCulture = null; // Formの起動処理 Application.Run(newForm()); // 言語の変更プロパティが設定されているか判定 if (ChangeCulture == null) { // 言語の変更でない場合は、終了する break; } else { // 言語の変更でない場合は、変更後の言語を設定し再起動する Thread.CurrentThread.CurrentUICulture = ChangeCulture; } } } finally { // リソースの解放処理を行う try { // 非同期処理の停止等のため登録されてるDispose対象のクラスについてDisposeを行う for (int i = 0; i < DisposeClass.Count; i++) { DisposeClass[i].Dispose(); } // Dispose対象のクラスを格納している配列を解放 DisposeClass.Clear(); // Mutexの所有権を保持している場合、所有権を解放する if (hasMutexOwnership) { mutex?.ReleaseMutex(); } } catch (Exception ex) when(ex is ApplicationException || ex is ObjectDisposedException) { // 下記のエラーの場合はMutexオブジェ区の破棄が完了しているためなにもしない // [ApplicationException] // ・呼び出しスレッドに独自のミューテックスが存在しない場合に発生 // 下記の // [ObjectDisposedException] // ・Mutexオブジェクトが既に破棄されている場合に発生 } finally { // Mutexオブジェクトを解放する mutex?.Close(); } } }
private void Create() { DisposeClass myClass = new DisposeClass(); }