2011年07月11日
川俣晶の縁側ソフトウェア技術雑記total 13812 count

C# 4.0: System.Draw.Color構造体型のデフォルト引数の値をColor.Emptyにできるか?

Written By: 川俣 晶連絡先

 実につまらない場所で手が止まったのでメモ。

 C# 4.0のデフォルト引数にはどのような値でも格納できるわけではなく、メタデータに格納できる値しか入りません。実行時に確定する値は格納できません。当然、readonlyのフィールド値(例Color.Empty)も使用できません。readonlyは初期化後に変更できないだけで、初期化時に値を変更できてしまうからです。(しかも、リフレクションで強引に書き換えることまでできてしまう)

 さて問題は、System.Draw.Color構造体でEmptyの値を無効扱いしていた場合です。クラスインスタンス引数にnullを渡すのと同じように、Emptyを渡して無効を示したいわけです。しかし、構造体はnullになりません。

 しかし、構造体はdefault(T)またはnew T()を引数に渡せます。

 問題は、default(T) == new T() == Emptyかという点です。

検証プログラム §

using System;

using System.Drawing;

class Program

{

    private static void sample(string name,Color a = default(Color))

    {

        Console.WriteLine("{0} is ARGB=({1},{2},{3},{4})",name,a.A,a.R,a.G,a.B);

    }

    static void Main(string[] args)

    {

        sample("by default parameter");

        sample("by Empty parameter",Color.Empty);

        Console.WriteLine(Color.Empty == default(Color));

        Console.WriteLine(Color.Empty == new Color());

    }

}

結果 §

by default parameter is ARGB=(0,0,0,0)

by Empty parameter is ARGB=(0,0,0,0)

True

True

結論 §

 Color.Emptyとdefault(Color)またはnew Color()の値は交換可能と思って良さそうです。

感想 §

 Color.Emptyをあまりに使い慣れていたので、new Color()で同じ値が得られるとは思ってもいなかたなあ。まして、default(Color)。デフォルト引数にColor.Emptyを書こうと思わなかったら、永遠に見落としたままだったかも。考えてみればこの結果は当たり前なのだけど。

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2011年
07月
19日
Windows Azureの管理ポータルがIE9で開かない
3days 0 count
total 3895 count
【技術雑記】の前のコンテンツ
2011年
07月
08日
感想・国際電子出版エキスポ
3days 0 count
total 3187 count

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

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

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

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

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

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

管理者: 川俣 晶連絡先

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