Nullable types

Denis Koroskin 2korden at gmail.com
Tue Oct 21 08:56:14 PDT 2008


On Tue, 21 Oct 2008 05:02:48 +0400, Bill Baxter <wbaxter at gmail.com> wrote:

> On Tue, Oct 21, 2008 at 9:40 AM, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>> Bill Baxter wrote:
>>>
>>> On Tue, Oct 21, 2008 at 9:11 AM, Lionello Lunesu  
>>> <lio at lunesu.remove.com>
>>> wrote:
>>>>
>>>> Bent Rasmussen wrote:
>>>>>
>>>>> Not true. It wraps the value type in a struct with a boolean field
>>>>> expressing whether it is null or not.
>>>>>
>>>>> http://msdn.microsoft.com/en-us/library/1t3y8s4s(VS.80).aspx
>>>>
>>>> Indeed. Thanks for pointing that out.
>>>>
>>>> So C#'s 'foo?' syntax has even less to do with this compile-time  
>>>> nullness
>>>> checking.
>>>
>>> Now it makes sense.  Yes the C# feature is apparently just a
>>> convenient way to create a value type with a special
>>> "none-of-the-above" value.
>>> I guess this feature is driven by need to connect with databases that
>>> often have nullable types.
>>>
>>> This chapter of a C# 2.0 book covering Nullable Types seems to agree
>>> with that assessment :
>>> http://www.springerlink.com/content/w2mh0571776t3114/
>>
>> Not a very clever design. If they took a hit of a Boolean field (= a  
>> word
>> field when padding is accounted for), they might as well have added a
>> reference to Exception. That way, you not only know the value is null,  
>> you
>> may also have info on why.
>
> Hmm, I was thinking storing a pointer to the value itself would make
> more sense than a bool.
> Along these lines:
>
> struct Nullable(T)
> {
>     private T _value;
>     private T* _ptr;  // maybe points to _value, maybe null
>
>     T* ptr { return _ptr; }
>     T value() { return *_ptr; }
>     void value(T v) { _value = v; _ptr = &_value; }
>     void value(T* v) { if (v is null) { _ptr = null; } else { _value =
> *v; _ptr = &_value; } }
> }
>
> That way you just get a null pointer exception for free when you try
> to use the nulled value.
> But maybe that's not a workable approach in C#.
>
> --bb

That's an overkill, operation cost gets too high for absolutely no reason.



More information about the Digitalmars-d mailing list