65

I have got an integer value and i need to check if it is NULL or not. I got it using a null-coalescing operator

C#:

public int? Age;

if ((Age ?? 0)==0)
{
   // do somethig
}

Now i have to check in a older application where the declaration part is not in ternary. So, how to achieve this without the null-coalescing operator.

Luuklag
  • 3,897
  • 11
  • 38
  • 57

8 Answers8

140

Nullable<T> (or ?) exposes a HasValue flag to denote if a value is set or the item is null.

Also, nullable types support ==:

if (Age == null)

The ?? is the null coalescing operator and doesn't result in a boolean expression, but a value returned:

int i = Age ?? 0;

So for your example:

if (age == null || age == 0)

Or:

if (age.GetValueOrDefault(0) == 0)

Or:

if ((age ?? 0) == 0)

Or ternary:

int i = age.HasValue ? age.Value : 0;
Adam Houldsworth
  • 63,413
  • 11
  • 150
  • 187
  • 12
    Good answer; func fact, though: the parameterless `age.GetValueOrDefault()` is marginally faster - it *completely bypasses* the "do I have a value" check, and just returns the value field - which will have defaulted to `default(T)`, aka `0`. – Marc Gravell Sep 21 '12 at 09:57
  • 1
    @MarcGravell Cool, but for the purposes of the answer I chose to be explicit. – Adam Houldsworth Sep 21 '12 at 10:02
17

Several things:

Age is not an integer - it is a nullable integer type. They are not the same. See the documentation for Nullable<T> on MSDN for details.

?? is the null coalesce operator, not the ternary operator (actually called the conditional operator).

To check if a nullable type has a value use HasValue, or check directly against null:

if(Age.HasValue)
{
   // Yay, it does!
}

if(Age == null)
{
   // It is null :(
}
Oded
  • 489,969
  • 99
  • 883
  • 1,009
4

Simply you can do this:

    public void CheckNull(int? item)
    {
        if (item != null)
        {
            //Do Something
        }

    }

Since C# version 9 you can do this:

  public void CheckNull(int? item)
  {
    if (!(item is null))
    {
        //Do Something
    }

  }

Or more readable:

  public void CheckNull(int? item)
  {
    if (item is not null)
    {
        //Do Something
    }

  }
fbarikzehy
  • 4,885
  • 2
  • 33
  • 39
2

There is already a correct answer from Adam, but you have another option to refactor your code:

if (Age.GetValueOrDefault() == 0)
{
    // it's null or 0
}
Smileek
  • 2,702
  • 23
  • 26
2

Because int is a ValueType then you can use the following code:

if(Age == default(int) || Age == null)

or

if(Age.HasValue && Age != 0) or if (!Age.HasValue || Age == 0)
MSD561
  • 512
  • 5
  • 16
1

As stated above, ?? is the null coalescing operator. So the equivalent to

(Age ?? 0) == 0

without using the ?? operator is

(!Age.HasValue) || Age == 0

However, there is no version of .Net that has Nullable< T > but not ??, so your statement,

Now i have to check in a older application where the declaration part is not in ternary.

is doubly invalid.

Jodrell
  • 34,946
  • 5
  • 87
  • 124
0

As of 2022 you can do it like this:

public int? Age;

if (Age is == 0)
{
   // do something
}
Alexei Sosin
  • 2,753
  • 1
  • 10
  • 13
0

.ToString() method help you the same

public int? Age;

if (!string.IsNullOrEmpty(Age.ToString()))
{
// do something
}
Sathish
  • 49
  • 3