如何退出using语句

时间:2013-05-16 14:20:29

标签: c#

我正在尝试退出using语句,同时保持一个封闭的for循环。例如。

 for (int i = _from; i <= _to; i++)
 {

    try
    {

        using (TransactionScope scope = new TransactionScope())
        {
            if (condition is true)
            {
                // I want to quit the using clause and
                // go to line marked //x below
                // using break or return drop me to line //y
                // outside of the for loop.
            }

        }

    } //x
}
//y

我已经尝试过使用break来解决这个问题,但是我希望保持在// x的for循环中,以便for循环继续处理。我知道我可以通过抛出异常并使用catch来实现它,但是如果有一种更优雅的方式来突破使用,我宁愿不做这个相对昂贵的操作。谢谢!

9 个答案:

答案 0 :(得分:8)

完全省略使用:

if (condition is false)
{
    using (TransactionScope scope = new TransactionScope())
    {
....

答案 1 :(得分:4)

不需要打破using块,因为使用块不会循环。你可以直接走到最后。如果存在您不想执行的代码,请使用if - 子句跳过它。

    using (TransactionScope scope = new TransactionScope())
    {
        if (condition)
        {
            // all your code that is executed only on condition
        }
    }

答案 2 :(得分:3)

只需更改if即可在条件为真的情况下输入块。然后将其余代码放在该块中。

答案 3 :(得分:3)

正如@Renan所说,你可以使用!运算符并在条件上反转你的bool结果。您还可以使用continue C#keyworkd转到循环的下一项。

for (int i = _from; i <= _to; i++)
{
    try
    {
        using (TransactionScope scope = new TransactionScope())
        {
            if (condition is true)
            {
                // some code
 
                continue; // go to next i
            }
        }
    }
}

答案 4 :(得分:1)

我会颠倒逻辑并说:

for (int i = _from; i <= _to; i++)
{

    try
    {

        using (TransactionScope scope = new TransactionScope())
        {
            if (condition is false)
            {
                // in here is the stuff you wanted to run in your using
            }
            //having nothing out here means you'll be out of the using immediately if the condition is true
        }

    } //x
}
//y

另一方面,如果你像Dave Bish建议的那样完全跳过使用,你的代码会表现得更好,因为在你不想使用它的情况下,你不会创建一个对象,只是不做任何事情。

答案 5 :(得分:0)

我想知道你为什么要在for循环中创建事务范围?有必要吗?可能导致可能升级到DTC?为什么不喜欢这个?

    using (TransactionScope scope = new TransactionScope())
    {
        for (int i = _from; i <= _to; i++)
        {
            if (condition)
            {
                // Do the do
                continue;
            }
        }
    }

答案 6 :(得分:0)

我只是想知道同一件事。给出的答案均不符合我的情况。然后我想通了:

异常通常是一些错误的标志。它们对于基本的流量控制也很有用。

for (int i = _from; i <= _to; i++)
 {

    try
    {

        using (TransactionScope scope = new TransactionScope())
        {
            if (condition is true)
            {
                throw new Exception("Condition is true.");
            }
        }

    } 
    catch(Exception exception)
    {
        Console.WriteLine(exception.Message);
    }//x
}
//y

答案 7 :(得分:0)

您可以使用标签,并使用goto label跳出using(()语句。

using (var scope = _services.CreateScope())
{
    if (condition) {
        goto finished;
    }
}

finished:
// continue operation here

答案 8 :(得分:-1)

您是否尝试过使用

continue;