私はC#/ VS2010でReSharperを使用しています。メインのUIスレッドでユーザーに情報を表示するためにフォームを開く必要がある別のスレッドを実行しています。私のコードは(素晴らしい作品がある)このでした:
ReSharperがform.Show()コードを修正したのはなぜですか?
this.Invoke(new MethodInvoker(delegate()
{
DisplayDownload form2 = new DisplayDownload();
form2.TopMost = true;
form2.Show();
}));
のReSharperはこれにそれを変更したいと私はそれを聞かせて(ただし、次のコードは、すべてのフォームが表示されません):
this.Invoke(new MethodInvoker(delegate()
{
using (var form2 = new DisplayDownload {TopMost = true})
{
form2.Show();
}
}));
フォームはReSharper修正コードでは表示されません。古いコードに戻っても問題ありません。
なぜReSharperがそれを変更した後に機能しないのですか?誰かが私にそれを説明してくれますか?変更されたコードがフォームを表示しない原因は何ですか?
USING文の中でShow()呼び出しをカプセル化してはいけませんか? – fraXis
Show()コールではなく、UsingステートメントでFormオブジェクトをカプセル化しないこのケースでは、他のケースでShowDialog()などを呼び出す場合は、許容可能な解決策となります。 – Tigran
はい、Show()でusingを使用しないでください。 showは非モーダルな状態でフォームを残しますが、Dispose(使用の最後の括弧)はそれを閉じます。R#はそこでの区別をしません。 Formオブジェクトをローカルでインスタンス化し、IDisposableなので、アプリケーションの終了前に処理する必要があることがわかります。フォームオブジェクトは、メソッドが終了した後に「ライブ」になるので、メソッドのローカルではなく、囲むクラスのメンバーにすることを検討する必要があります。それ以外の場合は、このコードが呼び出されるたびに新しいフォームを作成します。 –