我在C#.NET中编程。可以在不抛出异常的情况下中止类属性的set过程吗?
这是我想要做的......
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设置此值。
答案 0 :(得分:12)
IMO根本不是一件好事 - 期望就是如果set
没有抛出它就分配了值。在执行set
之前在UI(或其中)中进行测试,或抛出并处理异常。或者,调用者可能不会被方法混淆:
public bool TrySetRandomProperty(SomeType value) {
...
}
返回true
或false
以表明是否发生了这种情况。您还应该避免将UI代码放入域逻辑中;也许使用一个事件让UI与用户交谈,而不会在调用者身上造成特定的UI实现?
答案 1 :(得分:8)
在任何情况下都不应该执行此操作。属性应始终快速并在逻辑上代表某些内容的属性。理想情况下,它永远不会失败。它当然不应该产生副作用,如弹出UI。您违反了所有这些重要指南。不要这样做。
此外,您的UI设计很糟糕。不要事先询问用户“这可能需要一段时间,你确定吗?”然后如果他们点击是,则等待很长时间来惩罚他们。相反,启动操作,如果它没有快速返回,则弹出一个UI元素,显示一个进度条,剩下的估计时间有一个取消按钮。
您应该将长时间运行的操作编写为异步方法,可以在另一个线程上彻底取消。
这种事情的一个好架构是让你的方法立即返回一个对象,它暴露出事件,比如“我还在运行,这里有多远”,或者“我现在已经完成了,这就是结果“,或者”我在尝试进行操作时遇到了错误,而这就是它“。该对象还可以公开一个“取消”方法,该方法知道如何与工作线程通信并干净地关闭它。然后,获取此对象的方法的调用者可以决定如何向用户显示UI。
使用此架构,您可以清晰地将UI逻辑,异步逻辑和业务流程逻辑彼此分开。这是工作,但以后会带来好处。
答案 2 :(得分:3)
唉。你真的想让用户界面涉及一个类属性吗?你不应该在用户界面中进一步检查吗?
答案 3 :(得分:2)
你当然可以用这种方式编码,只是不要设置字段。
然而,当你将UI混合到低级代码中时,你的设计非常糟糕。
在设置属性之前询问问题是一个选项。
答案 4 :(得分:1)
退出套装。你必须使用私有字段来保存你想要设置的值,但是在“取消”中返回应该这样做。