避免在循环中进行对象实例化c# - 如何避免这种情况?

时间:2015-05-05 20:26:26

标签: c# object value-type reference-type

这是方案

我知道该类是引用类型,而结构是值类型

下面是 Code1 ,它成功输出了 Output1 这是预期的功能,因为在创建新的obj时会创建一个新的ref点并将其添加到人员列表中。

code2 中。相同的对象被分配,并且代码描述了foreach循环实际上正在更新Obj一直指向的相同引用。在for循环执行结束时,最终值将分配给所有列表项,如 Output2

对于 Code1 的情况,在CAST工具审核时,我们得到“避免在循环中进行对象实例化。”我知道for循环中的实例化对象也需要额外的内存和性能,这就是我猜CAST工具所说的我们。在这种情况下,有任何解决方案,我们可以避免循环内的新对象实例化。

使用Structures是基于当前场景的一种解决方案。但我想有任何其他想法。

代码1

   public class person
   {
       public string name { get; set; }
       public int age { get; set; }
   }

class Program
{
    static void Main(string[] args)
    {

        List<person> personList = new List<person>();

        for (int i = 0; i < 10; i++)
        {
        person Obj = Obj = new person();
            Obj.name = "Robert" + i;
            Obj.age = i * 10;
            personList.Add(Obj);
        }

        foreach(person indv in personList)
        {
            Console.WriteLine(indv.name + indv.age);
        }

    }
}

输出

Robert00 Robert110 Robert220 Robert330 Robert440 Robert550 Robert660 Robert770 Robert880 Robert990

代码2

  List<person> personList = new List<person>();
        person Obj = Obj = new person();
        for (int i = 0; i < 10; i++)
        {
            Obj.name = "Robert" + i;
            Obj.age = i * 10;
            personList.Add(Obj);
        }

        foreach(person indv in personList)
        {
            Console.WriteLine(indv.name + indv.age);
        }

输出2

Robert990 Robert990 Robert990 Robert990 Robert990 Robert990 Robert990 Robert990 Robert990

3 个答案:

答案 0 :(得分:8)

  

我知道for循环中的实例化对象也需要额外的内存和性能,这正是我猜CAST工具告诉我们的。

那是不对的。分配将具有相同的价格&#34;当在循环内部或外部使用时。我假设你的工具警告你,因为在每次迭代中在一个循环中分配对象可能会导致很多对象被实现,但这正是这里所需要的。在这种情况下,绝对没有必要避免对象分配。

我更担心您使用的特定工具及其带来的建议。

答案 1 :(得分:1)

实例化这些对象没有任何问题,所以我无法想到为什么你的工具会告诉你。在一天结束时,代码的重点是创建一个“人”对象列表。无论你是在一个循环中完成它,还是连续输入所有10个实例,它都没有什么区别。循环显然更好。

另一方面,您可以使用linq来简化此代码,尝试以这种方式编写代码并查看您的工具是否给出了相同的警告:

List<person> personList = Enumerable.Range(1, 9).Select(x => 
new person { name = "Robert" + x, age = x * 10 }).ToList();

答案 2 :(得分:0)

我主要是避免在循环中进行实例化,在这种情况下我想在循环之外使用对象并且它没有被添加到集合中。另外,如果我在循环中实例化并将对象传递给循环中的另一个方法,则没有必要。在这种情况下,您可以在循环外实例化并将值传递给循环内的方法。如果这是您要使用的所有代码,请在循环内部移动Console.WriteLine,并且不要在循环内部进行实例化。

但我得到的印象是,您正在尝试在循环内创建一个对象集合,以便在该循环之外使用。在这种情况下,您的对象集合不会有任何更大的内存占用,因为您实例化了循环内的对象。如您所见,如果您在循环外实例化对象,则只需将新值分配给同一对象,然后多次向该数组添加对同一对象的引用。无论你做什么,都需要实例化数组中的每个对象。