Обнуляемый оператор и оператор && в C # - PullRequest
3 голосов
/ 28 апреля 2010

Возможно ли совместное использование оператора ?? и оператора && в следующем случае:

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

Это означает следующее:

  • если any равно нулю, то this.Any.HasValue вернуть false
  • если any имеет значение, то оно возвращает значение с учетом другого логического свойства, т.е. Any && SomeBool

Ответы [ 7 ]

4 голосов
/ 28 апреля 2010

Мне интересно, почему до сих пор никто не предложил это:

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

Возвращает

  • null если any равно нулю, независимо от значения this.SomeBool;
  • true, если оба any и this.SomeBool верны; и
  • false, если any не равно нулю, а this.SomeBool равно ложному.
4 голосов
/ 28 апреля 2010

Поскольку вы хотите вернуть null в случае, если источником является null, я не думаю, что ?? поможет вам написать это короче или яснее.

3 голосов
/ 28 апреля 2010

Оператор Null Coalescing не будет работать для того, как вы структурировали логику для вашего метода. Конечно, вы могли бы заставить его там, но это будет выглядеть уродливо и просто запутать, кто бы это ни читал.

Мне было трудно прочитать и понять исходный код, поэтому он подверг рефакторингу и удалил троичный оператор для выявления намерений.

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;
3 голосов
/ 28 апреля 2010

Я думаю, что вы пытаетесь сделать это:

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, то вы хотите вернуть true или null, верно?

3 голосов
/ 28 апреля 2010

Это то, что вы имеете в виду?

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

Поведение здесь не совсем такое, как оригинал, так как null должен быть возвращен, чтобы тестовые случаи 1 и 4 были идентичными. Но, может быть, такое поведение не обязательно?

1 голос
/ 28 апреля 2010

дело в том, что вы не хотите использовать ?? оператор. Он предназначен для того, чтобы было легко избежать нулей, вы на самом деле хотите сохранить нулевые значения.

0 голосов
/ 28 апреля 2010

Это поведение, которое вы описываете:

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

...