@Musigenesis,您真的不想在更改对话框时强制客户端代码中断,并且使用仅有时有效的 out 参数不是一个好的设计。正如@Daok 所说,当您返回超过 1 个值时,这开始变得混乱和难看。
您也不能强制客户端代码使用结果,就像 .net 框架确保您调用文件对话框上的属性一样。你也没有强迫调用者对 out 参数做任何事情,你强迫他们做的只是接受一个他们可能不想使用的变量。
如果对话框非常通用,这可能不适用,但与其将各种属性添加到对话框本身,不如使用一个在整个应用程序中一致使用的方法,并返回一个特定的类,该类包含相关数据。
public sealed class MySaveDialogResult
{
public static MySaveDialogResult NonOkResult(); // Null Object pattern
public MySaveDialogResult( string filePath ) { ... }
// encapsulate the dialog result
public DialogResult DialogResult { get; private set; }
// some property that was set in the dialog
public string FilePath { get; private set; }
// another property set in the dialog
public bool AllowOVerwrite { get; private set; }
}
你的对话是
public MySaveDialog ...
{
public MySaveDialogResult GetDialogResult() { .... }
}
本质是一个小的不可变实用程序类,它也实现了空对象模式。只要对话结果不正确,就会返回 null 对象。显然,上面的内容是为了满足您的需求而在黑暗中拍摄的,因此可以随意更改它,制作继承层次结构等。
重点是让GetDialogResult(),对话框上的单个方法,返回一个封装所有相关对话框数据的类。
编辑:
@yapiskan 想知道为什么不直接“退出”MyDialogResult 而不是调用GetDialogResult()。
IMO - 要点很简单:
- 这不是惯例
- 方法调用非常简单,当您遵循上述“约定”参数时,方法调用会变得更容易。
-
out 使用起来很尴尬。 GetDialogResult() 不会强制调用者编写笨拙的代码,也不会强制用户在调用对话框时消费对话框结果。
-
通常对话框不会重新实例化或重新显示以获得结果,它已经存在。 Show() 和 Hide() 就是这样做的。
现实情况是,您正在用一个笨拙的 ShowDialog() 语法调用方法。方法调用很便宜,你不能保证调用者会使用你的 out 参数,就像你不能保证他们会调用 GetDialogResult() 一样。那何必呢。让这个东西易于使用,或者一开始就不要重载 ShowDialog。
也许你的子类是时髦的并且行为不同,它不适用于你的情况,但一般的设计是当你点击 OK 时表单不会消失,当它们被 Disposed() 时它们会消失。