c#条件检查

本文关键字:检查 条件 | 更新日期: 2023-09-27 18:06:31

我需要经常检查条件。不是在每个循环迭代中,而是在函数执行期间。

像这样的字符是不可接受的:

 while(condition)
 {
      ...
 }

当条件显示为真时,我需要简单地中止函数,甚至在进程的"中间"。什么好主意吗?

c#条件检查

当条件显示为真时,我需要简单地中止函数,甚至在进程的"中间"。什么好主意吗?

没有"简单"的方法可以在执行过程中中止函数[*],这是一件好事。中途中止函数可能会使系统处于不一致的状态(想象一下在写文件的过程中中止)。

正确的方法是在你的函数中识别可能中断的"安全点",并在那里进行检查:

... // 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()会立即关闭线程,因此通常这是一个坏主意。

不幸的是,一个更好的解决方案是从循环内的多个地方检查条件。