Search code examples
c#initializationautomatic-properties

C# Automatic Properties - Still null after +=?


This seems like a bug to me...

I accept that automatic properties, defined as such:

public decimal? Total { get; set; }

Will be null when they are first accessed. They haven't been initialized, so of course they are null.

But, even after setting their value through +=, this decimal? still remains null. So after:

Total += 8;

Total is still null. How can this be correct? I understand that it's doing a (null + 8), but seems strange that it doesn't pick up that it means it should just be set to 8...

Addendums:

I made the "null + 8" point in my question - but notice that it works with strings. So, it does null + "hello" just fine, and returns "hello". Therefore, behind the scenes, it is initializing the string to a string object with the value of "hello". The behavior should be the same for the other types, IMO. It might be because a string can accept a null as a value, but still, a null string is not an initialized object, correct?

Perhaps it's just because a string isn't a nullable...


Solution

  • public decimal? Total { get; set; }
    

    Think of null as "unknown value". If you have an unknown quantity of something and you add 8 more, how many do you have now?

    Answer: unknown.

    Operations on Nullable Variables

    There are cases where operations on unknown values give you knowable results.

    public bool? State { get; set; }
    

    The following statements have knowable solutions even though they contain unknown values:

    State = null;
    nextState = State & false;         // always equals false
    nextState = State & true;          // still unknown (null)
    
    nextState = State | true;          // always true
    nextState = State | false;         // still unknown (null)
    

    See the pattern?

    Of course, if you want Total to be equivalent (equal) to 0 when it is null, you can use the null coalescing operator and write something like this:

    Total = (Total ?? 0) + 8;
    

    That will use the value of Total in your equation unless it is null, in which case it will use the value 0.