【问题标题】:Unreferenced vs referenced use of object未引用与引用的对象使用
【发布时间】:2017-10-26 08:25:17
【问题描述】:

我有一个由设计师创建并设置的表单“MyForm.cs”。我需要它只是为了通知用户一个错误,并且在他单击其“确定”按钮后表单关闭并且我再也不需要它,除非发生相同的错误,这将是罕见的(这是一个已处理的错误)。

我可以通过两种方式显示表单:
未引用
new MyForm().ShowDialog();

参考
MyForm myForm = new MyForm();
myForm.ShowDialog();

由于我不会重复使用表单,因此我认为不需要为其命名,最好使用未引用的语法?

用一个代替另一个有什么好处吗?

【问题讨论】:

  • 只要使用using System.Windows.Forms,它就会识别Form类实例化,这样两个语句都有效(我认为除了可读性之外没有其他好处,你可以使用var form = new Form()来简化声明) .
  • 如果你真的只需要它一次,你可以扔掉对表单的引用。但是请注意,使用Show 而不是ShowDialog 会在完成后在表单上调用Dispose,因此您应该将引用存储到变量中。
  • 我不是 WinForm 方面的专家,但作为最佳 OOP 实践,您应该避免在另一个类中实例化 Form。我假设您需要使用要重用的文本设置对话框吗?因此,我建议您在 Form 类上创建一个静态工厂方法并在那里传递设置参数(如对话框的文本),或者在 .ShowDialog() 中进行。
  • @Steve,我正在使用表单内的其他控件来显示 MessageBox 可以显示的更多信息。
  • 你所说的“匿名”实际上是“未引用”,而你所说的“命名”只是“引用”。你不是用这段代码“命名”它。

标签: c# forms winforms


【解决方案1】:

您所谓的“匿名”只是一种类型的实例,当您完成该实例时,您会丢弃该类型的引用。如果您确定不会对实例执行任何操作,则可以这样做。在您的情况下,您需要在表单上调用Dispose,这就是为什么扔掉引用是一个坏主意。您肯定需要对要处理的实例的引用。来自MSDN

如果表单使用 显示方法。如果使用了 ShowDialog 等其他方法,或者表单 根本没有显示,你必须在你的内部调用 Dispose 应用。

如果在另一边调用ShowDispose-方法将在完成后自动被调用,所以你可以扔掉引用。

所以你可以这样写:

using(var f = new MyForm())
{
    f.ShowDialog(...);
    // do something with the form
}

除了上述之外,将引用存储到变量中几乎都是好主意,因为它提高了可读性。这是您的代码的每个用户都了解当语句具有描述其用途的清晰名称时的作用。

【讨论】:

  • 只是出于好奇,您可能会从内部处理对话框,不是吗?因此,您以后可能不需要保存对 Dispose 的引用。附言我是一名 Android 和 Xamarin.Android 开发人员,所以我可能会弄错或遗漏一些逻辑。
  • @Gugas:您将如何从内部处理表单?不,调用者应该在完成后处理它,上面的代码就是这样做的。在using-statement 范围的末尾,表单被释放。
  • 啊-h-h-h,谢谢我不知道“ShowDialog()”不会自动处理它。我认为如果它超出范围,垃圾收集器会将其取出,但我将使用 using
  • @J.Doe 重要的一点:垃圾收集器只清理内存 - 它不会清理诸如 Windows 句柄之类的东西,这就是为什么您必须通过 using 显式或隐式调用 Dispose()
猜你喜欢
  • 2019-03-20
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2014-06-25
相关资源
最近更新 更多