今天在微软新闻组里,看到有人问对于以下这个类:
class Test
{
public Test()
{
throw new Exception("Can not use this constructor");
}
public void Hello()
{
Console.WriteLine("hello World");
}
}
如何成功调用它的Hello方法。
这个类的构造函数里会扔出异常,而类实例化的时候会自动调用构造函数,这样用普通的方法我们永远也得不到一个可以成功调用方法的类的实例。那么有什么办法,可以突破构造函数这个限制?
用反射似乎不行,因为反射要生成一个实例,也还是要调用构造函数,那么有什么其它方法吗?
呵呵,请原谅我卖了那么长时间的关子,好东西总要留到最后,不是吗?
其实,我们可以这样做:
class main
{
static void Main(string[] args)
{
//此处获得了一个未经初始化的实例(没有调用构造函数)
Test t = (Test)System.Runtime.Serialization.FormatterServices.GetUninitializedObject( typeof(Test) );
t.Hello();
}
}
是不是有点奇技淫巧的感觉? 嘿嘿
我第一次看到这个方法是在思归呓语上的一个帖子(在思归的blog上找了半天,也没找到原帖,还是用goolge才找到了....)