2015-05-05 2 views
0

Вот сценарийИзбегайте создания объектов в цикле C# - Как этого можно избежать?

Я знаю, что класс ссылочные типы и структуры типы значений

Ниже Вы Code1 успешно выводит output1, который, как ожидается, функциональность, потому как новый OBJ создается создается новый пункт ref и добавляется в список лиц.

В code2. Тот же объект получает назначение и, поскольку код описывает цикл foreach, фактически обновляет ту же ссылку, что Obj указывает все время. В конце для выполнения цикла, окончательное значение присваивается всем элементам списка, как в Выход2

Для случая Code1 при рассмотрении CAST инструмента мы получаем «Избегайте объекта экземпляра в циклах» .Я знаю объекты Инстанцирование in for цикл также требует дополнительной памяти и производительности, что и говорит нам инструмент CAST. В таких сценариях есть какое-то решение, в котором мы можем избежать установки нового объекта внутри цикла.

Использование структур - одно из решений, основанных на настоящем сценарии. Но я хотел бы иметь любые другие идеи.

Код 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

Code 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

+6

Я хотел бы избежать, пытаясь избежать создания объекта в этот экземпляр. – Matthew

+3

Нет ничего плохого в создании объектов в цикле, чтобы заполнить список. Предупреждение говорит о повторном создании объектов на каждой итерации цикла *, когда на самом деле нужен только один экземпляр *. – Blorgbeard

+2

Я голосую, чтобы закрыть этот вопрос не по теме, потому что это не разумный вопрос. –

ответ

7

Я знаю, что объекты-объекты-объекты в цикле for занимают дополнительную память и производительность, что, как мне кажется, говорит нам инструмент CAST.

Это неправильная информация. При использовании внутри или вне этого цикла распределение будет иметь одинаковую цену. Я предполагаю, что ваш инструмент предупреждает вас, потому что выделение объектов в цикле на каждой итерации может привести к тому, что многие объекты будут инстансированы, , но это именно то, что нужно здесь. В этом случае нет необходимости избегать выделения объектов.

Меня больше беспокоит тот конкретный инструмент, который вы используете, и советы, которые он приносит.

0

В основном я избегаю создания экземпляров в цикле в тех случаях, когда я хочу использовать объект за пределами цикла, и он не добавляется в коллекцию. Кроме того, это не было бы необходимо, если бы я создавал экземпляр в цикле и передавал объект другому методу в цикле. В этом случае вы можете создать экземпляр вне цикла и передать значения методу внутри цикла. Если это весь код, который вы собираетесь использовать, переместите Console.WriteLine внутри цикла и не пытайтесь создать экземпляр внутри цикла.

Но создается впечатление, что вы пытаетесь создать коллекцию объектов внутри цикла для использования вне этого цикла. В этом случае ваша коллекция объектов не будет иметь больший объем памяти просто потому, что вы создавали объекты внутри цикла. Как вы можете видеть, если вы создаете экземпляр объекта за пределами цикла, вы просто назначаете новое значение одному и тому же объекту, а затем добавляете ссылку на один и тот же объект несколько раз на массив. Вам нужно будет создать экземпляр каждого объекта в массиве независимо от того, что вы делаете.

1

Нет ничего плохого в создании экземпляров этих объектов, поэтому я не могу понять, почему ваш инструмент говорит вам об этом. В конце концов, весь смысл вашего кода - создать список объектов «человек». Независимо от того, делали ли вы это в цикле или вводили все 10 экземпляров подряд, это не имело бы никакого значения. Очевидно, что петля лучше.

На другой ноте, хотя, вы можете реально упростить этот код с помощью LINQ, попытайтесь писать это так и если ваш инструмент дает вам такое же предупреждение:

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

действительно то, что я искал, thnx – LumbusterTick

Смежные вопросы