2006年02月22日
川俣晶の縁側ソフトウェア技術雑記total 3895 count

Nullableに対抗するNeverNullable構造体はC# 2.0で作れるか?

Written By: 川俣 晶連絡先

 昨日書いたRDBにおけるNULLの害悪を説くNULL撲滅委員会・ならば私はC#において説いてみようか?で、欲しかったのはNullable型ではなく、NeverNullable型だということを書きました。

 そこで、Nullable型の実体は構造体でしかないということに気づき、ならばNeverNullable構造体をC# 2.0で書けるか……と思って軽く試作してみました。

惨敗ソース §

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication77

{

    public struct NeverNullable<T>

    {

        T m_value;

        public NeverNullable(T value)

        {

            if (value == null)

            {

                throw new NullReferenceException();

            }

            m_value = value;

        }

        public static implicit operator NeverNullable<T>( T value )

        {

            if (value == null)

            {

                throw new NullReferenceException();

            }

            return new NeverNullable<T>(value);

        }

        public static explicit operator T(NeverNullable<T> value)

        {

            return value.m_value;

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            NeverNullable<string> a = new NeverNullable<string>("test1");

            Console.WriteLine(a); // (※)そのまま使うと文字列は出力されない

            Console.WriteLine((string)a); // キャストすれば文字列扱いにできる

            a = "test2"; // 文字列オブジェクトへの入れ替えは可能    

            Console.WriteLine((string)a);

            try

            {

                a = null; // nullへの置き換えは不可能。例外を投げる

            }

            catch (NullReferenceException)

            {

                Console.WriteLine("nullは代入できません!");

            }

            // 次のコード、なんとnull値を持つオブジェクトができてしまいます

            NeverNullable<string> b = new NeverNullable<string>();

            Console.WriteLine((string)b == null);

        }

    }

}

実行結果 §

ConsoleApplication77.NeverNullable`1[System.String]

test1

test2

nullは代入できません!

True

結果 §

 途中まで、割と上手く行くかと思ったのですが、引数のないコンストラクタを使った構造体の初期化が可能ということで破綻しました。

 クラスだと引数のないコンストラクタを持たせないことは容易なのですが、構造体では違うようです。(構造体は引数のないコンストラクタを宣言できない制約を持つ)

 まあ、たとえそれが可能だったとしても、書きにくく読みにくいし、潜在的なトラブルのリスクも抱えている(※の行を参照)ので、実際に使うことは無いと思いますが……。

Facebook

このサイト内の関連コンテンツ リスト

2006年
02月
21日
RDBにおけるNULLの害悪を説くNULL撲滅委員会・ならば私はC#において説いてみようか?
3days 0 count
total 8226 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

https://mag.autumn.org/tb.aspx/20060222151839
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.