在循环C#中创建对象

bat*_*adi 6 c#

只是对下面的代码感到好奇.

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个对象.


Joh*_*ler 13

唯一的区别是在第二个示例中,循环仍可访问最后创建的实例