1

我需要编写一个使用(单行 if)语句的语法,但我需要在某种意义上嵌套它:

(表达式 1)?

(如果表达式 2 抛出ArgumentExceptionstring.emptyelse expression2):string.empty

所以基本上我需要弄清楚在 c# 中的单行 if 语句中使用 try catch 的语法(单行,因为我需要在 linq to sql select 语句中使用它。)

单行 if 语句我的意思是使用三元运算符 if 语句而没有任何分号。

4

5 回答 5

7

你在找这样的东西吗?

(/*expression1*/)? (foo()? string.empty: /*expression2*/):string.empty

与 foo 是:

public /*static?*/ bool foo()
{
    try
    {
        //do stuff
    }
    catch(ArgumentException)
    {
        return true
    }
    catch
    {
        return false
    }
    return false;
}

至于将 Try/Catch 嵌入到 Linq to Sql 语句中......好吧,我们只是说在这种情况下我会尝试重新考虑我的设计。

于 2013-01-08T22:00:13.870 回答
3

这是一个有趣的问题,因为它会让您问:代码块需要标记为“单行”的标准应该是什么?

显然,写 8 行代码然后去掉换行符并不会变成一行代码。

这个怎么样:

    public string Expression2()
    {
        return "One does not write maintainable code this way";
    }

    [Test]
    public void TryCatchAsSingleLine()
    {
        bool expr1 = true;


         // Would you say this is one line?
        string result = expr1 
                            ? (new Func<string>(() => 
                                              { 
                                                 try 
                                                 { 
                                                    return Expression2(); 
                                                 } 
                                                 catch 
                                                 { 
                                                    return string.Empty; 
                                                 } 
                                               }
                                               )
                             )() 
                             : string.Empty;
    }
于 2013-01-08T22:09:05.153 回答
1

将此用作单线:

Exception e=null; try { expr1; } catch (Exception ex) {e = ex;} if (e is ArgumentException) { expression2; } else { do whatever or not sure what you want to do with string.empty; }
于 2013-01-08T22:02:34.753 回答
0

尝试使用一两个方法调用。

class Test
{
    static void Main(string[] args)
    {
        if (ExpressionOne() && ExpressionTwo() != string.Empty) DoSomething();
    }

    static bool ExpressionOne()
    {
        // check something
    }

    static string ExpressionTwo()
    {
        try
        {
            return ThisMayThrowArgumentExceptionOrReturnAString();
        }
        catch (ArgumentException)
        {
            return string.Empty;
        }
    }

    // ...
}
于 2013-01-08T22:01:23.313 回答
0

C# 不是面向行的,因此您可以在一行上编写所有内容,但生成的代码并不总是可读和可维护的。

我会为可能失败的代码编写一个单独的方法。

public string GetResultSafely()
{
    try {
        // Possibly failing
        return ReadStringFromExternalResource();
    } catch() {
       return String.Empty;
    }
}

进而

result = expression1 ? GetResultSafely() : GetAnotherResult();

请注意,抛出异常不应该是标准的做事方式。如果可能,请避免异常。

坏的:

try {
    result = x / y;
} catch {
    Console.WriteLine("Division by zero!");
}

好的:

if (y == 0) {
    Console.WriteLine("Division by zero!");
} else {
    result = x / y;
}

但是,在某些情况下,例外是不可避免的。通常在访问外部资源时。

于 2013-01-08T22:10:47.303 回答