只是对下面的代码感到好奇.
for (int i=0; i<9; i++)
{
ClassA objectA = new ClassA();
}
Run Code Online (Sandbox Code Playgroud)
要么
ClassA objectA;
for (int i=0; i<9; i++)
{
objectA = new ClassA();
}
Run Code Online (Sandbox Code Playgroud)
任何想法都有两个代码的差异?根据我的知识,每次都会创建不同的实例,所以实例的数量会相同.任何想法?
Mar*_*ell 25
除了范围(即变量是否存在于循环外)通常没有区别,因为.NET变量实际上(在IL中)无论如何都在方法的开头.但是,有一个例外:如果捕获变量(进入匿名方法/ lambda),那么它的行为会有所不同 - 捕获的构造是为了尊重C#声明.所以:
List<Action> actions = new List<Action>();
ClassA objectA;
for (int i=0;i<9;i++)
{
objectA= new ClassA();
actions.Add(delegate { Console.WriteLine(objectA.GetHashCode()); });
}
foreach(Action action in actions) action();
Run Code Online (Sandbox Code Playgroud)
和:
List<Action> actions = new List<Action>();
for (int i=0;i<9;i++)
{
ClassA objectA= new ClassA();
actions.Add(delegate { Console.WriteLine(objectA.GetHashCode()); });
}
foreach(Action action in actions) action();
Run Code Online (Sandbox Code Playgroud)
将做不同的事情(第一次打印相同的基于地址的哈希码9次;第二次打印9个不同的基于地址的哈希码,表明在第二个循环中我们捕获了9个不同的变量,而不是单个变量).
在这两种情况下都ClassA创建了9个对象 - 只是在第一种情况下我们不能再看到其中的8个对象.
| 归档时间: |
|
| 查看次数: |
11821 次 |
| 最近记录: |