在.Net中,微软给我们提供了很多不同的创建对象实例的方法,它们的速度又各有不同,以下一一列举。
使用new关键字
这在.Net中是最常见,也是速度最快的方式:
var instance = new Class();
使用System.Activator类的CreateInstance方法动态创建
这里的CreateInstance指的是Activator的非泛型方法:
var instance
=
System.Activator.CreateInstance(
typeof
(Class));
使用System.Activator类的CreateInstance<T>方法动态创建
这里的CreateInstance才是Activator的泛型方法:
var instance
=
System.Activator.CreateInstance
<
Class
>
();
使用泛型约束,使用new关键字创建对象(泛型方法)
首先需要创建一个泛型的方法:
public
static
T CreateInstance
<
T
>
()
where
T :
new
()
{
{
return
new
T();
}
}
这里利用泛型约束where T: new(),保证了T类型是可以用无参构造器构造的,所以代码里面就可以直接使用new T()来创建对象:
var instance = CreateInstance<Class>();
用泛型类的静态方法、泛型约束和new关键字创建
这里需要首先创建一个泛型类
public
static
class
StaticInitializer
<
T
>
where
T:
new
()
{
public static T CreateInstance()
{
return new T();
}
}
{
public static T CreateInstance()
{
return new T();
}
}
然后使用如下代码创建实例:
var instance
=
StaticInitializer
<
Class
>
.CreateInstance();
使用泛型类的动态方法、泛型约束和new关键字
这里使用的是泛型类的实力方法,需要首先创建一个泛型类:
public
class
DynamicInitializer
<
T
>
where
T:
new
()
{
public T CreateInstance()
{
return new T();
}
}
{
public T CreateInstance()
{
return new T();
}
}
使用的方法就是:
var initializer
=
new
DynamicInitializer
<
Class
>
();
var instance = initializer.CreateInstance();
var instance = initializer.CreateInstance();
测试内容:
创建100万个对象。
测试方式:
for
(var i
=
0
; i
<
1000000
; i
++
)
// create the instance
// create the instance
然后计算这段代码消耗的时间
测试结果:
- 使用new关键字 17ms
- 使用System.Activator类的CreateInstance方法动态创建 484ms
- 使用System.Activator类的CreateInstance<T>方法动态创建 1545ms
- 使用泛型约束,使用new关键字创建对象(泛型方法)1604ms
- 使用泛型类的静态方法、泛型约束和new关键字创建 1504ms
- 使用泛型类的动态方法、泛型约束和new关键字 1481ms
这里使用new关键字无疑是最快的,比较有趣的主要有以下2点:
- 使用System.Activator的非泛型方法比使用泛型方法快很多(超过200%)
- 使用泛型约束和new关键字创建的速度几乎和System.Activator的泛型方法的一样