@ Musigenesis, вы действительно не хотите, чтобы клиентский код ломался при изменении вашего диалога, и использование параметра out, который действует только иногда, не очень хороший дизайн. Как говорит @Daok, когда возвращается более 1 значения, это начинает становиться грязным и ужасным.
Вы также не можете заставить клиентский код использовать результат, если только .net Framework гарантирует, что вы вызываете свойства в диалоговом окне файла. Вы также не заставляете вызывающую функцию делать что-либо с параметром 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() { .... }
}
Суть - это небольшой неизменяемый служебный класс, который также реализует шаблон нулевого объекта. Пустой объект возвращается всякий раз, когда результат диалога не был в порядке. Очевидно, что вышесказанное - это выстрел в темноте для ваших нужд, поэтому изменяйте его по своему желанию, создавайте иерархии наследования и т. Д.
Суть в том, чтобы GetDialogResult()
, единственный метод в диалоге, возвращал класс, который инкапсулирует все соответствующие данные диалога.
редактирование:
@ yapiskan задается вопросом, почему бы просто не «выйти» из MyDialogResult
против вызова GetDialogResult()
.
IMO - Очки просто:
- Это не соглашение
- Вызов метода тривиально прост, и его легче выполнять, если следовать приведенному выше аргументу «конвенция».
out
неудобно использовать. GetDialogResult()
не заставляет вызывающую сторону писать неуклюжий код и не заставляет пользователя использовать результат диалога в момент вызова диалога.
- Обычно диалоговое окно не восстанавливается и не отображается повторно для получения результата, оно уже там. Show () и Hide () делают именно это.
Реальность такова, что вы торгуете вызовом метода для неуклюжего синтаксиса ShowDialog (). Вызовы методов дешевы, и вы не можете гарантировать, что вызывающая сторона будет использовать ваш параметр out больше, чем вы можете гарантировать, что они вызовут GetDialogResult (). Так зачем? Сделайте эту штуку простой в использовании или не перегружайте ShowDialog.
Может быть, все, что вы подклассифицирует, является забавным и действует по-другому, и это не применимо к вашей ситуации, но общий дизайн - формы не исчезают, когда вы нажимаете OK, они уходят, когда они находятся в Disposed ().