3

次の場合、演算子??と演算子を一緒に使用することは可能ですか?&&

bool? Any
{
   get
   {
      var any = this.ViewState["any"] as bool?;
      return any.HasValue ? any.Value && this.SomeBool : any;
   }
}

これは次を意味します:

  • anynullの場合this.Any.HasValuefalse
  • 値がある場合anyは、別のブールプロパティを考慮して値を返します。Any && SomeBool
4

7 に答える 7

4

nullソースがである場合に備えて戻りたいので、これをより短くまたはより明確に書くのに役立つとはnull思わない。??

于 2010-04-27T22:26:44.150 に答える
4

なぜこれまで誰もこれを提案していないのだろうか。

bool? any = this.ViewState["any"] as bool?;
return any & this.SomeBool;

これは

  • nullanyがnullの場合、の値に関係なくthis.SomeBool;
  • trueanyとが両方ともthis.SomeBool真の場合。と
  • falseanyがnullでなく、this.SomeBoolfalseの場合。
于 2010-04-28T00:03:01.687 に答える
3

これはどういう意味ですか?

bool? Any 
{ 
   get 
   { 
      return ((this.ViewState["any"] as bool?) ?? false) && this.SomeBool;
   } 
} 

戻り値をboolのままにしましたか?しかし、それはただのboolに変更できるように見えます。

これは次のようにテストされました:

class Program
{
    private static readonly Dictionary<string, object> ViewState = new Dictionary<string, object>();
    private static bool SomeBool;

    static void Main(string[] args)
    {
        ViewState["any"] = (bool?)null; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)false; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)true; SomeBool = true; Console.WriteLine(Any);
        ViewState["any"] = (bool?)null; SomeBool = false; Console.WriteLine(Any);
        ViewState["any"] = (bool?)false; SomeBool = false; Console.WriteLine(Any);
        ViewState["any"] = (bool?)true; SomeBool = false; Console.WriteLine(Any);
        Console.ReadLine();
    }

    static bool? Any
    {
        get
        {
            return ((ViewState["any"] as bool?) ?? false) && SomeBool;
        }
    }
}

これは

False
False
True
False
False
False

テストケース1と4が同一であるためには、nullが返される必要があるため、ここでの動作は元の動作とまったく同じではありません。しかし、おそらくその動作は必要ありませんか?

于 2010-04-27T22:22:58.830 に答える
3

Null合体演算子は、メソッドのロジックをどのように構造化したかについては機能しません。確かにそこにそれを強制することはできますが、それは醜く見え、それを読む人を混乱させるだけです。

元のコードは読みにくく、理解しにくいと感じたので、意図を明らかにするために三項演算子をリファクタリングして削除しました。

bool? any = this.ViewState["any"] as bool?;

if (any == null)
    return null;

return any.Value && this.SomeBool;

ヌル合体はちょうどいい速記であり、慎重に使用する必要があります

Person contact = Mother ?? Father ?? FirstSibling;

以下よりも意図を明らかにし、読みやすく、維持しやすいです。

Person contact = Mother;
if (contact == null)
    contact = Father;
if (contact == null)
    contact = FirstSibling;
于 2010-04-28T00:26:18.977 に答える
2

私はあなたがやろうとしていることはこれだと思います:

return any ?? (any.Value && this.SomeBool) ? true : new Nullable<bool>();

ただし、このような場合は、ifブロックを使用する方がおそらくより明確だと思います。

if ( !any.HasValue )
  return (any.Value && this.SomeBool) ? true : any;
else 
  return any;

もしあればnull、あなたは戻りたいですtruenull、そうですか?

于 2010-04-27T22:30:56.827 に答える
1

物事は、あなたは本当に使用したくないですか?オペレーター。これは、nullを簡単に回避できるようにすることを目的としており、実際にはnullを保持する必要があります。

于 2010-04-27T22:42:05.373 に答える
-1

これはあなたが説明する振る舞いを持っています:

return (any ?? false) && this.SomeBool

于 2010-04-27T22:25:34.793 に答える