我需要编写一个使用(单行if)语句的语法,但我需要在某种意义上嵌套它:
(表达式1)?
(如果表达式2抛出ArgumentException
,则string.empty
抛出其他expression2
):string.empty
所以基本上我需要弄清楚在c#中单行if if语句中使用try catch的语法(单行,因为我需要在linq到sql select语句中使用它。)
单行if语句我的意思是使用三元运算符if语句而没有任何分号。
答案 0 :(得分:6)
(/*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语句中......好吧,我只想说在这种情况下我会尝试重新考虑我的设计。
答案 1 :(得分: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;
}
答案 2 :(得分:2)
将此作为单行使用:
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; }
答案 3 :(得分: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;
}
}
// ...
}
答案 4 :(得分:0)
C#不是面向行的,因此您可以在一行中编写所有内容,但生成的代码并不总是可读和可维护的。
我会为可能失败的代码编写一个单独的方法。
public string GetResultSafely()
{
try {
// Possibly failing
return ReadStringFromExternalResource();
} catch() {
return String.Empty;
}
}
然后
result = expression1 ? GetResultSafely() : GetAnotherResult();
请注意,抛出异常不应该是标准的处理方式。如果可能,请避免例外。
BAD:
try {
result = x / y;
} catch {
Console.WriteLine("Division by zero!");
}
GOOD:
if (y == 0) {
Console.WriteLine("Division by zero!");
} else {
result = x / y;
}
但是,有些情况下无法避免例外情况。通常在访问外部资源时。