c#条件检查
本文关键字:检查 条件 | 更新日期: 2023-09-27 18:06:31
我需要经常检查条件。不是在每个循环迭代中,而是在函数执行期间。
像这样的字符是不可接受的:
while(condition)
{
...
}
当条件显示为真时,我需要简单地中止函数,甚至在进程的"中间"。什么好主意吗?
当条件显示为真时,我需要简单地中止函数,甚至在进程的"中间"。什么好主意吗?
没有"简单"的方法可以在执行过程中中止函数[*],这是一件好事。中途中止函数可能会使系统处于不一致的状态(想象一下在写文件的过程中中止)。
正确的方法是在你的函数中识别可能中断的"安全点",并在那里进行检查:
... // some statement
if (condition) return;
... // some more statements
if (condition) return;
...
脚注:[*]当我说没有简单的方法中止一个函数时,我是在撒谎。有一个,它被称为Thread.Abort
(你需要在一个单独的线程中运行你的函数,并在另一个线程中监视condition
,通常是主UI线程)。然而,使用线程。由于上述原因,Abort 非常不鼓励使用。别这么做。
我认为你需要重新考虑你想要什么。对你的问题最直接的回答是,你可以在循环中检查,如果条件为真就中断,你可以多次这样做。
但是看起来更有可能的是你拥有/需要的是一个后台进程,一个额外的循环并不是那么重要,你只需要一种在ALTERNATE条件为真时停止它的方法。对于这个问题,一个后台线程可能是答案。
假设这是某种错误处理断言条件-看看。net代码契约和ContractInvariantMethod,这里有一个很好的例子。
允许您定义不允许发生的条件,如果在运行时发生,则会导致断言。
以下内容摘自链接。它强制平衡永远不能为负,否则将发生异常。
class Account
{
private int balance
[ContractInvariantMethod]
private void BalanceHasToAlwaysBeInTheBlack()
{
// Note to reader: only conditions can be in here
Contract.Invariant(balance >= 0)
}
public void Deposit(int amount)
{
Contract.Requires(amount > 0)
Contract.Ensures(balance > amount) // Note to reader: you can also ensure on the returned object e.g. Contract.Ensures(Contract.Result<int>() > 0)
balance += amount
}
public void Withdraw(int amount)
{
Contract.Requires(amount > 0)
balance -= amount
}
}
使用break
语句退出循环。
如果需要退出某个函数,请使用return
语句。
从你的问题中不完全清楚你到底想要达到什么,因此一般的答案
您可以按照这里的文档调查产量http://msdn.microsoft.com/en-us/library/9k7k7cf0(v=vs.80).aspx
c#中没有预定义的结构可以自动执行您想要的操作。据我所知并没有。你必须自己实现它。
检查某些函数的bool
返回值的条件。并在您想要检查它的地方调用该函数,并检查该函数的调用是否返回false
(例如),之后您可以使用break
, return
任何执行中断指令(基于调用上下文)。
break
语句可以让您跳出循环。至于监听条件变化的机制,依赖while循环并不完全有效,因为编译器需要到达作用域的末端才能注册条件不再有效。
你的问题的一个答案是:启动一个单独的Thread
来执行工作,并检查主线程中的条件。当条件发生变化时,您可以Abort()
工作线程,立即关闭它。
但是,您将使系统处于未知状态,因为Abort()
会立即关闭线程,因此通常这是一个坏主意。
不幸的是,一个更好的解决方案是从循环内的多个地方检查条件。