6

C#では、このようなことを簡単に行うことはできますか?

 bool validName = true;
 if (validName)
 {
     name = "Daniel";
     surname = "Smith";
 }
 else
 {
     MessageBox.Show("Invalid name");
 }

これに似たものが機能するかどうか疑問に思っていましたが、この正確なシナリオでは、 name = validName を実行した場合に値を割り当てることができることを知っていますか? "Daniel" : "無効" ですが、以下を実行できるかどうか疑問に思っていました。

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
4

5 に答える 5

10

ラムダ構文と型推論の悪用:

(validName
    ? (Action)
        (() =>
            {
                name = "Daniel";
                surname = "Smith";
            })
      : () =>
           {
                MessageBox.Show("Invalid name");
           })();

私は知っています、実際には答えではありません。if ステートメントの方がはるかに優れています。明らかに、この構文は読みにくく、さらに重要なことに、実行時の動作が異なり、ラムダ式によって作成される潜在的なクロージャーのために、意図しない副作用につながる可能性があります。

構文も少し不可解です。最初に 2 つのActionオブジェクトを作成し、次に?:オペレーターがそれらの中から選択し、最後に選択した結果が実行されます。

var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

結果のアクションをその場で実行することにより、1 つのステートメントにまとめました。さらに簡潔にするために、最初のラムダ式をAction(明示的に を作成する代わりにnew Action()) にキャストし、型推論を利用して 2 番目のキャストを省略しました。

于 2014-07-30T16:54:16.267 に答える
6

それができるとしましょう。なんで?

動機は何ですか?

行数が少ない?違いを生むには不十分です。パフォーマンス?なし。コンパイラが処理します。明快さ?If/else はより明確で、大多数の開発者にとってより簡単に理解できます。

十分な努力をすれば、これを処理する方法を見つけることができると確信していますが (ほとんどの場合はクラッジ)、その理由はまだわかりません。

于 2014-07-30T16:36:48.213 に答える
6

いいえ。

三項演算子 (?:) は、全体として、式、つまり何かに代入できるものでなければなりません。

于 2014-07-30T16:34:11.760 に答える
4

条件演算子では、2 番目と 3 番目のオペランドが、値に解決されないステートメントではなく、(いくつかの型制限を満たすことに加えて) 値を返す式である必要があります。現在実行中のどちらの操作からも返したい値がありません。

コードをコンパイルするためだけに無意味な値を返すこともできますが、その時点ifでは、要件に適したセマンティック演算子である を使用するだけでなく、さらに多くの作業を追加しているため、技術的には可能ですが、良い考えではありません。

于 2014-07-30T16:35:21.810 に答える
1
fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null


public string returnName(string name)
{
return name;
}

public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}

他の誰もがおそらく言っているように、それはおそらくあなたが本当にやりたくないことだと言っていますが、それは可能です:P

于 2014-07-30T16:48:02.050 に答える