文章有误,等待晚上的新版本。。。
对于
没有直接实例化的
把实例化放在中间
对于
public static Object CreateInstance (
Type type
)
Type type
)
方法我想您应该用过,当您需要动态的创建某些类型实例的时候您就需要它了。但是我今天测试该方法和用Expression Tree方法实例化对象的哪个执行的效率更快的时候,我发现一个问题。我把问题代码抽出来,做几个实验,您看看:(该实验在vs2008和vs2005下面都做了,实验结果一样,具体数值是vs2005下面的,以下代码均是在Release模式下)

1 Stopwatch watch1 = new Stopwatch();
2 watch1.Start();
3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
4 watch1.Stop();
5 Console.WriteLine("Activator CreateInstance");
6 Console.WriteLine(watch1.Elapsed.ToString());
7
2 watch1.Start();
3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
4 watch1.Stop();
5 Console.WriteLine("Activator CreateInstance");
6 Console.WriteLine(watch1.Elapsed.ToString());
7
得出的记过为:
Activator CreateInstance
00:00:00.0001561
00:00:00.0001561
我在前面加上如下代码:
Class1 c1 = new Class1();
再执行,我们看看结果:
Activator CreateInstance
00:00:00.0000203
00:00:00.0000203
您看到区别了吗?没有Class1 c1 = new Class1();的时候执行时间是有Class1 c1 = new Class1();执行时间的将近8倍。那么我们再看下面的代码:

1 Class1 c1 = new Class1();
2
3 Stopwatch watch1 = new Stopwatch();
4 watch1.Start();
5 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
6 watch1.Stop();
7 Console.WriteLine("Activator CreateInstance");
8 Console.WriteLine(watch1.Elapsed.ToString());
9
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());
2
3 Stopwatch watch1 = new Stopwatch();
4 watch1.Start();
5 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
6 watch1.Stop();
7 Console.WriteLine("Activator CreateInstance");
8 Console.WriteLine(watch1.Elapsed.ToString());
9
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());
我们再一次执行方法Activator.CreateInstance(),您能想到执行结果吗?
Activator CreateInstance
00:00:00.0000206
Activator CreateInstance
00:00:00.0001156
00:00:00.0000206
Activator CreateInstance
00:00:00.0001156
吆喝,这个结果真是怪异啊!那么再来看这个:

1 Stopwatch watch1 = new Stopwatch();
2 watch1.Start();
3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
4 watch1.Stop();
5 Console.WriteLine("Activator CreateInstance");
6 Console.WriteLine(watch1.Elapsed.ToString());
7
8 Class1 c1 = new Class1();
9
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());
2 watch1.Start();
3 Class1 formActivator1 = Activator.CreateInstance(typeof(Class1)) as Class1;
4 watch1.Stop();
5 Console.WriteLine("Activator CreateInstance");
6 Console.WriteLine(watch1.Elapsed.ToString());
7
8 Class1 c1 = new Class1();
9
10 Stopwatch watch2 = new Stopwatch();
11 watch2.Start();
12 Class1 formActivator2 = Activator.CreateInstance(typeof(Class1)) as Class1;
13 watch2.Stop();
14 Console.WriteLine("Activator CreateInstance");
15 Console.WriteLine(watch2.Elapsed.ToString());
您注意第八行,我们把实例化的代码放在中间了,那么结果又会怎么样呢?您请看:
Activator CreateInstance
00:00:00.0001715
Activator CreateInstance
00:00:00.0001111
00:00:00.0001715
Activator CreateInstance
00:00:00.0001111
和您预想的结果一样吗?
以下的疑问您能解答吗?
1. Activator.CreateInstance到底是怎么实例化对象的,和new有什么区别呢?
2. 为什么前面加上对象的直接实例化就会出现执行效率上的区别呢?
3. 为什么把直接实例化放在中间就没有相应的效果了呢?
4. 既然这样,那么我直接实例化两次对象用方法Activator.CreateInstance(),会不会第二次的执行时间要比第一次少很多呢?(我的实验结果,没有影响)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构