質問: true; } ``` ### 補足情報(言語/FW/ツール等のバージョンなど) Microsoft Visual Studio Community 2015 Version 14.0.25424.00 Update 3 Microsoft .NET Framework Version 4.6.01038 インストールしているバージョン:Community Visual C# 2015 00322-20000-00000-AA575 Microsoft Visual C# 2015 です。 よろしくお願いします。
回答: ご提示いただいたソースの構造は以下のようになっています。 * MainWindow(1).Window_Loaded内 logicalオブジェクト生成、Operation()呼び出し ↓ * logical.Operation内 MainWindow(2)オブジェクト生成、IsCloseOK = true ↓ * MainWindow(2).IsClosed内 自身をClose() 上記(1)と(2)は別のWindowオブジェクトなので、(2)に対してCloseを呼び出しても、表示中の(1)はクローズされていない、という状態です。 (フィールドのIsCloseOkだけstaticにしているのは、何か勘違いされているかも? プロパティがstaticでないので、呼び出しは当然インスタンスに対して実行されます) MainWindow側でロジックの終了を検知してCloseしたい場合、たとえば非同期呼び出しをawaitで待機する方法があります。 ``` namespace logical { public class logical { public async Task/*Taskを戻り値にすることでawait可能になる*/ Operation() { //処理 var response = await operationAsync(); var resultString = await response.Content.ReadAsStringAsync(); // MainWindow mw = new MainWindow(); // mw.IsCloseOK = true; } ``` ``` namespace windowManager { public class MainWindow : Window { public MainWindow() { InitializeComponent(); } private async void Window_Loaded(object sender, RoutedEventArgs e) { var logical = new logical(); //※awaitをつけることで、呼び出しの終了を待ってから以下が実行されます。 await logical.Operation(); Close(); } } ``` > > そもそもこういうときは、クラスを分ける意味があるでしょうか? > > クラスを分けた場合、ロジッククラスとウィンドウクラスでなにを受け持つべきでしょう? > > > すみません。上記のご質問については、ご提示のソースだけでは一概に答えかねます。 どのクラスに何を受け持たせるか、という点こそがクラス設計の肝だと思いますので、 クラスを分ける意味が見出せるまでは分けない、というのも選択肢のひとつかもしれません。 (ただ、Closeのような画面処理は画面クラスで、という考え方は間違っていないと思いますよ)