2

a ?? b

  • そうaでない場合null=> を返しますa
  • Else ( ais null) => を返しますb

その逆のようなものをシミュレートしたい (私の知る限り、これを行う演算子はありません):

  • aの場合null=> 戻りaます。
  • Else (aではないnull) => を返しますb

アイデアは、パラメーターを受け取り、回避する必要がbある関数の結果であるということです。このように: XX は演算子になります (存在する場合)。anulla XX fn(a)

私の唯一の2つのバリアントは次のとおりです。

  • a == null ? a : fn(a)
  • a == null ? null : fn(a)

このコードを単純化する方法はありますか?

4

5 に答える 5

3

何を達成しようとしているのか正確にわかりませんか?このようなもの?

TResult NullFn<TParam, TResult>(TParam a, Func<TParam, TResult> method)
{
if(a == null) return null;
return method(a);
}

...

var result = NullFn(a, a => fn(a))

しかし、私見の最善の解決策fnは、null 値が渡された場合に null を返すことです。

編集:

上の方法は一例です。特定の領域で同じ操作が何度も何度も行われており、fn を変更できない状況では、このようなものを使用することをお勧めします。将来、すべての操作の null 処理動作を一度に変更したくなる可能性があります。(そもそもあなたが尋ねているので、そうであると仮定しています。)しかし、NullFn関数が目の前にない場合に何が起こっているのかが明確ではないため、アプリケーション全体でこれを使用することはありません。あなたの。

于 2012-12-13T20:43:20.603 に答える
1

単純な状態の何が問題になっていますか?

if (a != null) b = fn(a);

別のオプション-メソッドに条件を追加します。

public B fn(A a)
{
    if (a == null)
        return null;

    return new B();
}
于 2012-12-13T20:38:18.543 に答える
1

個人的には私が好むだろう

(a != null) ? fn(a) : null

意図がより明確になると思うからですが、そこまで単純化する方法が思い浮かびません。必要に応じて拡張メソッドを使用できます。

a.CallIfNotNull(fn)

次の拡張メソッドで

internal static T CallIfNotNull<T>(this T value, Func<T, T> function)
    where T : class
{
    return (value != null) ? function(value) : null;
}

それほど良くはありませんが、おそらくエラーが発生しにくく、IntelliSense を使用すると入力しやすくなります。

(質問が示唆するように、関数は引数と同じ型の値を返すと想定されています。)

于 2012-12-13T20:47:15.643 に答える
0

同じユーザー定義型 Tを持っていT a;T fn(T a);使用している場合は、書くことができa && fn(a)、それは に展開されT.False(a) ? a : T.&(a, fn(a))ます。

于 2012-12-13T20:45:07.957 に答える
0

下部にある ?: 実装を使用して、独自の質問に答えました。

私が提案する唯一の改善点は、機能をよりクリーンでエラーが発生しにくい方法でラップすることです。

object SafeB(object a)
{
    return a==null ? a : b(a);
}

コンパイラはおそらくこれをインライン化するため、パフォーマンスが低下することはありません。

さらに統合されたソリューションになるように、b を提供するクラスの拡張メソッドとして実装することもできます。

于 2012-12-13T20:52:55.463 に答える