C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2008/04/24 23:28
通常、インスタンスを生成する際には必ずコンストラクタが呼び出されます。
でも実は、コンストラクタを実行せずにインスタンスを生成することができます。

方法はとても簡単です。
生成したいインスタンスの型情報を渡して FormatterServices クラス (System.Runtime.Serialization)GetUninitializedObject メソッド を呼び出すだけです。
このクラスは、通常シリアル化で使用されるクラスですが、インスタンス化したいクラスに SerializableAttribute クラス (System) が付加されている必要はありません。
それと面白いことに、Void 構造体 (System) をインスタンス化することができます。 (Activator じゃできないのに)
ただし、String クラス (System)ContextBoundObject クラス (System) はこの方法でインスタンス化することができません。

下記のコードでは、コンストラクタの処理中に例外をスローするクラスのインスタンスを生成できることが確認できます。

using System;
using System.Runtime.Serialization;

class Program
{
    static void Main()
    {
        Hoge h = (Hoge)FormatterServices.GetUninitializedObject(typeof(Hoge));
    }
}

public class Hoge
{
    public Hoge()
    {
        throw new NotSupportedException();
    }
}
タグ: .NET C# CLR











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/211-bb191869