Solved

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

Posted on 2004-10-12
10
211 Views
Last Modified: 2010-04-15
.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
0
Comment
Question by:mattizzle
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 3
10 Comments
 
LVL 8

Accepted Solution

by:
Razzie_ earned 150 total points
ID: 12288556
From the C# 2.0 language specification: nullable value types: http://download.microsoft.com/download/8/1/6/81682478-4018-48fe-9e5e-f87a44af3db9/NullableTypesProposal.pdf

It's an interesting read!
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 12288594
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.
0
 
LVL 8

Expert Comment

by:Razzie_
ID: 12288647
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.
0
Creating Instructional Tutorials  

For Any Use & On Any Platform

Contextual Guidance at the moment of need helps your employees/users adopt software o& achieve even the most complex tasks instantly. Boost knowledge retention, software adoption & employee engagement with easy solution.

 
LVL 14

Expert Comment

by:AvonWyss
ID: 12288689
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.
0
 
LVL 2

Author Comment

by:mattizzle
ID: 12288838
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.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 12288872
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.
0
 
LVL 2

Author Comment

by:mattizzle
ID: 12288923
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
0
 
LVL 8

Expert Comment

by:Razzie_
ID: 12289156
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.
0
 
LVL 2

Author Comment

by:mattizzle
ID: 12289713
>> 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

0
 
LVL 8

Expert Comment

by:Razzie_
ID: 12290178
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 :)
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

738 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question