前言:有时候我们编写看似很正统的代码,在运行时致命的错误往往发生的最不经意的地方,下面的问题你是否也关注过?
实例化很显然就那么几种:
- new实例化
- 激活器器Activator.CreateInstance:
- 反射System.Reflection.Assembly.Load("..").CreateInstance(""),这个用法编译后会成为上一种
- 委托反射,性能较好
泛型是个好东西,它可以在对象的声明时不指定类型,而在实例化中再定类型。
由于泛型在可以适用于值类型、引用类型、方法、委托、事件,因此如果在声明时没有限制类型,那在实例化中就可能产生漏洞!
default(T) :
泛型代码:指定类型参数的默认值。对于引用类型为空,对于值类型为零;
演示代码:
public class Garder<T>
{
T t;
public Garder()
{
if (typeof(T).IsValueType || typeof(T) == typeof(String))
{
t = default(T);//String类型没有无参构造函数,故排除
}
else
{
t = Activator.CreateInstance<T>();//实例化
}
}
public void printT()
{
Console.WriteLine("t:" + t.GetType());
}
}
测试:
class Program
{
static void Main(string[] args)
{
Garder<int> t = new Garder<int>();
t.printT();
Garder<Son> t2 = new Garder<Son>();
t2.printT();
Garder<string> t3 = new Garder<string>();
t3.printT();
}