3

我正在用 C#.NET 编程。是否可以在不引发异常的情况下中止类属性的设置过程?

这就是我想做的...

public int RandomProperty
{
    set
    {
     DialogResult answer = new DialogResult();
     answer = MessageBox.Show("This process could take up to 5 min. Are you sure you want to continue?");
     if(answer = DialogResult.No) 
        CancelSet   // Can I do something similar here?
     else
     {
      ...Do set procedure
     }
    }
}

我认为我不能使用方法(而不是属性),因为我正在使用 propertygrid 设置这个值。

4

5 回答 5

12

IMO 这根本不是一件好事 -期望是如果set不抛出它分配的值。在执行, 或抛出并处理异常之前在 UI(或任何地方)进行测试。set或者,调用者可能不会被方法混淆:

public bool TrySetRandomProperty(SomeType value) {
    ...
}

它返回truefalse指示它是否发生。您还应该避免将 UI 代码渗入域逻辑;也许使用一个事件让 UI 与用户对话,而不会对调用者造成特定的 UI 实现?

于 2010-02-17T16:16:43.713 回答
8

在任何情况下,您都不应该这样做。属性应该总是快速且逻辑上表示某物的属性。理想情况下,它永远不会失败。它当然不应该产生诸如弹出 UI 之类的副作用。你违反了所有这些重要的准则。不要这样做。

此外,您的 UI 设计很糟糕。不要事先问用户“这可能需要一段时间,你确定吗?” 如果他们点击是,然后长时间等待惩罚他们。相反,开始操作,如果它没有快速返回,则弹出一个 UI 元素,该元素显示一个进度条和一个带有取消按钮的估计剩余时间。

您可能应该将长时间运行的操作编写为可以在另一个线程上完全取消的异步方法。

这种事情的一个好的架构是让你的方法立即返回一个对象,该对象公开诸如“我仍在运行,这是我走了多远”或“我现在完成了,这是结果”之类的事件,或者“我在尝试执行操作时遇到错误,这就是它的原因”。该对象还可以公开一个“取消”方法,该方法知道如何与工作线程通信并干净地关闭它。获取此对象的方法的调用者然后可以决定如何向用户显示 UI。

使用这种架构,您可以将 UI 逻辑、异步逻辑和业务流程逻辑清晰地彼此分离。这是工作,但它会在以后支付红利。

于 2010-02-17T18:55:04.057 回答
3

啊。您真的想在类属性中包含用户界面吗?您不应该在用户界面中进一步检查吗?

于 2010-02-17T16:17:15.557 回答
2

你当然可以这样编码,只是不要设置字段。

但是,当您将 UI 混合到低级代码中时,您的设计非常糟糕。

在设置属性之前提出问题是一种选择。

于 2010-02-17T16:18:05.460 回答
1

只是从集合中返回。您必须使用私有字段来保存您要设置的值,但在“取消”中返回应该可以。

于 2010-02-17T16:15:21.673 回答