質問
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");
}
. 解決
乱用の乱用構文と型推論:
(validName
? (Action)
(() =>
{
name = "Daniel";
surname = "Smith";
})
: () =>
{
MessageBox.Show("Invalid name");
})();
.
私は知っています、本当に答えではありません。ステートメントが良い方法である場合:明らかにこの構文はより読みやすく、より重要なことは異なるランタイムの振る舞いを持ち、ラムダ表現によって作成された潜在的な閉鎖のために意図しない副作用につながる可能性があります。
構文も少し非暗号化です。それは最初に2つのAction
オブジェクトを作成し、?:
オペレータはそれらの間でそれらの間で選択され、最後に選択された結果が実行されます:
var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });
Action resultingAction = test_variable ? a1 : a2;
resultingAction();
.
結果の対応する行動を実行することで、1つの声明にまとめています。それをBRIEFERさえ、最初のLambda式をAction
にキャストし、(new Action()
を明示的に作成する代わりに)、および2番目のキャストを省略しています。
他のヒント
あなたがそれをすることができたと言ってみましょう。なぜ?
モチベーションとは何ですか?
ライン数?違いを生むのに十分ではありません。 パフォーマンス?None、コンパイラはあなたのためのものを処理します。 明快さ?もしそうでなければ、開発者の大多数でより明確にそしてより容易に理解されている。
私は確かに、あなたが十分に一生懸命働いたならば、あなたはこれを処理する方法を見つけることができました(ほとんどの可能性のあるkludge)、しかし私はなぜ私はなぜ私はまだ決まりません。
いいえ。
三元演算子(?:)は、全体として、つまり、何かに割り当てることができるものです。
条件付き演算子には、その2番目と3番目のオペランドが、値を値に解決しないステートメントではなく、その2番目と3番目のオペランドを表現する必要があります。現在実行している操作から復帰したい値はありません。
コードをコンパイルするためだけに無意味な値を返すことができましたが、その時点では、必要に応じて正しい意味演算子であるif
を使用するだけでなく、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