Link to home
Start Free TrialLog in
Avatar of mattizzle
mattizzle

asked on

Null value types? (requires an expert of genius proportions)

.NET offers value types to describe primitive values such as int, boolean, double, etc.  But there is no reference types of offered - I see this as problematic because I am unable to represent a primitive variable as null.  I realize I can box a value type, but then I lose type safety.

For example - if I had a "Person" object with an "Age" property that returned an Int32 - I cannot set the "Age" to null.  So if, for example, a user chose NOT to provide their age I would have to set it to some arbitrary value that I could interpret as "not set", such as -1.  But then, every bit of code that needs to determine whether "Age" was "set" would have to know that "-1" is the magic number that means "not set".

To resolve this I have created my own reference type implementations of the .NET primitives.  And, although they solve my problem, it is a drag that I use my proprietary solution rather than Microsoft offering a more global solution.

I'm hoping that my problem is a result of my lack of understanding of .NET.  Otherwise, I'll be really disappointed in Microsoft (again) :(

-M
ASKER CERTIFIED SOLUTION
Avatar of Razzie_
Razzie_

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
As Razzie noted, the new .NET framework and the C# 2.0 compiler will support this.

If you write your own class, you lose much of the performance which is given when using value types. I'd rather use a special value; I tend to use the MinValue member for such things if needed.
Avatar of Razzie_
Razzie_

I can be mistaken btw, but I don't believe a language like Java supports nullable value types? So you'd experience these problems in other languages, too.

There are a lot of people who wonder if nullable value types is indeed a good idea.
Well, Java also has these wrappers for value types, which are the counterparts to the boxed .NET objects. These are nullable, but are in fact not nullable value types, but normal objects wrapping a value type. I think that nullable value types can be a userful feature, but one should have to do a explicit cast to assign a nullable value type to a non-nullable value type in my opinion.
Avatar of mattizzle

ASKER

Right - I realize that there is no such thing as a nullable value type.  What I meant was a reference equivalent of a value type that can be set to null.  Like Java's Integer, Long, and Double objects.
In the currently released versions, there is only the variant of boxing them which comes out-of-the box. Everything more sophisticated or type-safe needs to be written by the programmer... but usually, there are ways to prevent the use of nullable types alltogether, like using flags, etc.
Razzie - thanks for the article, I'll check it out and get back to you.  I called microsoft about this problem about 18 months ago - I wonder if my complain was taken into consideration when this document was published?  B^)  

Anyway - you mentioned that "There are a lot of people who wonder if nullable value types is indeed a good idea".  I guess my opinion is that the solution doesn't have to be nullable value types, but at least a global solution to differentiating a "set" and "not set" value type.  And, aside from inherant performance issues with reference type implementations, do you know of any other arguments against it?

-Matt
What I meant more is that a lot of people wonder if nullable types are a good addition to the C# language in general. The big argument is if it is REALLY needed. Sure it can be useful, but C# works perfect as it is. Some argument that adding nullable value types can only mess things up, your code is more open for errors, the syntax is confusing, will it be implemented right? Read the nullable types specification and you'll know it gets very complex, especially with all the new rules and operators.

int? i; // nullable type
int x = (int)i;

is not valid. Confusing? maybe :)

Like AvonWyss said, it can be good for numerous things, for example database operations, but it irrevocably bring some problems unless you fully understand how it works.
>> it can be good for numerous things, for example database operations
I've never written an application for a client that didn't write to a database; so I say it is absolutely necessary that a language provide this support.

>> but C# works perfect as it is
So, how many shares of Microsoft stock /do/ you own? ;)

>> C# Nullable Types article
I've skimmed the article and it is good to see that they are moving in the right direction.  I am not sure that the solution is the way I would go, but then again I am partial to Java ;)  

What do I need to do to take advantage of this feature?  Is it ready for production use?

My two cents:
I think if Microsoft integrated a reference type with implicit conversion and overloaded binary and unary operators, they would be on to something.  I realize there is a performance trade-off there, but will probably not be noticable in your everyday run-of-the-mill enterprise client application.  And, for those applications that need to optimize, they are still free to use primitives.

-M

I have no affiliation with Microsoft whatsoever, lol.
The article is an interesting read yes, but while reading you do get the feeling that is much more complicated than you thought it would be (at least I did).

The 2.0 Framework is still in developement thus Beta. I thought it was planned for March 2005 but I could be wrong there. Maybe it will be released with Longhorn. You can go here for more info: http://msdn.microsoft.com/netframework/downloads/updates/default.aspx for SDK's. VS.NET 2005 Beta (light edition) is available here: http://lab.msdn.microsoft.com/vs2005/ - I believe 2005 is integrated with the 2.0 framework.

I'd wish it was possible to use Int32 someInt = null which would seem pretty logical, unfortunately it isn't :)