如果有这样一个类: class Test { public Test() { throw new Exception("Can not use this constructor"); } public void Hello() { Console.WriteLine("hello World"); } }我们可以这样获得一个没有初始化过的实例: class main { static void Main(string[] args) { //此处获得了一个未经初始化的实例(没有调用构造函数) Test t = (Test)System.Runtime.Serialization.FormatterServices.GetUninitializedObject( typeof(Test) ); t.Hello(); } }运行以上程序并没有出现异常,由此可以证明刻实例的构造函数并没有被调用。
to cppTrier: 你的解决方案中还是用了typeof(Test) ,那么表示你已经知道这个对象的类型是Test了。
已经定义该变量,只是没有初始化而已。 在程序的某处已经定义了变量如: Test t; 现在获取了这个t变量,要知道t的类型。
我希望能够得到如下的结果。 public class C { } public class Test { public Type GetTpyeFunction(Object o) { //获取该变量的类型。 } public static void Main() { Test t = new Test(); C c; t.GetTpyeFunction(c); } }
{
//执行代码
}
class Test
{
public Test()
{
throw new Exception("Can not use this constructor");
}
public void Hello()
{
Console.WriteLine("hello World");
}
}我们可以这样获得一个没有初始化过的实例:
class main
{
static void Main(string[] args)
{
//此处获得了一个未经初始化的实例(没有调用构造函数)
Test t = (Test)System.Runtime.Serialization.FormatterServices.GetUninitializedObject( typeof(Test) );
t.Hello();
}
}运行以上程序并没有出现异常,由此可以证明刻实例的构造函数并没有被调用。
所以楼上说的不对, 掉用GetUninitializedObject方法 以后并不会产生Test的一个实例,也就是说t这时候还是null, 只有在执行t.Hello()的时候,只执行hello()里面的代码,Test类里面的别的方法和字段都不会初始化, 除非Hello()方法里面使用了别的成员字段或方法。所以通过 GetUninitializedObject方法得到的实例执行方法和用static方法作用类似,这样test并没有初始化,所以也就不会执行构造函数了。
你的解决方案中还是用了typeof(Test) ,那么表示你已经知道这个对象的类型是Test了。
在程序的某处已经定义了变量如: Test t;
现在获取了这个t变量,要知道t的类型。
public class C
{
} public class Test
{
public Type GetTpyeFunction(Object o)
{
//获取该变量的类型。
} public static void Main()
{
Test t = new Test();
C c;
t.GetTpyeFunction(c);
}
}