1

(1 行の if) ステートメントを使用する構文を記述する必要がありますが、次の意味でネストする必要があります。

(式1)?

(式 2 がスローされArgumentExceptionた場合、string.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をLinqtoSqlステートメントに埋め込む限り...まあ、その場合は自分のデザインを再考しようとするとしましょう。

于 2013-01-08T22:00:13.870 に答える
3

これは興味深い質問です。コード ブロックに「1 行」というラベルを付けるには、どのような基準が必要ですか?

明らかに、8 行のコードを記述してから改行文字を削除しても、1 行のコードにはなりません。

これはどう:

    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

メソッド呼び出しを 1 つまたは 2 つ使用してみてください。

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# は行指向ではないため、すべてを 1 行で記述できますが、結果のコードは常に読みやすく保守しやすいとは限りません。

失敗する可能性のあるコードに対して別のメソッドを作成します。

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 に答える