К “новому” или не к “новому”

Здесь, в этой части, вам действительно нужно:

resources.forEach(o => {
  let tempArr = o.split("-");
  if(tempObj[tempArr[0]]){
    tempObj[tempArr[0]] = [...tempObj[tempArr[0]], tempArr[1]];
  }else{
  tempObj[tempArr[0]] = [tempArr[1]]
  }
})
6
задан Welbog 20 April 2009 в 16:15
поделиться

9 ответов

В вашем сценарии кажется, что фактическое создание объекта выполняется внутри вашего GetList () метод. Таким образом, ваш первый пример будет правильным.

При создании ваш список хранится в куче, а ваш listCustClass просто является ссылкой на этот новый объект. , Когда для listCustClass установлено значение GetList () , указатель ссылки listCustClass отбрасывается и заменяется указателем ссылки на то, что GetList () возвращает (может быть нулевым) , Когда это происходит, ваш оригинальный List все еще находится в куче, но никакие объекты не указывают на него, поэтому он просто тратит ресурсы, пока не соберется сборщик мусора и не очистит его.

8
ответ дан 8 December 2019 в 02:00
поделиться

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

43
ответ дан 8 December 2019 в 02:00
поделиться

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

Примеры, где я мог бы использовать инициализацию для нового, пустого списка.

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );

или

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
18
ответ дан 8 December 2019 в 02:00
поделиться

Вы используете ключевое слово new для создания нового экземпляра объекта. Из вашего вопроса не ясно, что делает метод GetList , но, вероятно, он либо создает новый список (таким образом перемещая ключевое слово new в другое место), либо возвращает существующий список (который кто-то создал в одной точке, используя new ).

3
ответ дан 8 December 2019 в 02:00
поделиться

Если вы можете вставить это без потери смысла и ясности того, что вы делаете, во что бы то ни стало, встроенным.

Редактировать: И, как я регулярно подчеркивал, я даже не думал о ссылке на осиротевший объект. Doh. =)

2
ответ дан 8 December 2019 в 02:00
поделиться

Новое ключевое слово в основном используется для выделения места в куче. Если вы создаете тип значения (структуры и т. Д.), Вам не нужно использовать ключевое слово new. Однако ссылочные переменные должны быть new'd, прежде чем они будут использованы.

В приведенном выше примере кажется, что GetList () возвращает ссылку, которая имеет тип List, который был бы создан (new'd) где-то в функции. Следовательно, в этом сценарии новое бессмысленно.

3
ответ дан 8 December 2019 в 02:00
поделиться

Эмпирическое правило отсутствует, но есть здравый смысл, который вы можете применять большую часть времени.

Объект должен быть создан при создании. Ваша функция GetList () якобы возвращает (созданный) IList, поэтому второй фрагмент кода совершенно не нужен (вы создаете экземпляр IList и фактически удаляете его на следующей строке).

Однако первый фрагмент полностью уместен.

1
ответ дан 8 December 2019 в 02:00
поделиться

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

Вы используете new, когда вы присваиваете (что может быть частью объявления).

Первый пример верный, второй - ненужная трата ресурсов времени выполнения.

0
ответ дан 8 December 2019 в 02:00
поделиться

В C# все экземпляры классов должны быть созданы с помощью ключевого слова new. Если вы не используете new в текущем контексте, у вас либо есть нулевая ссылка, либо вы вызываете функцию, которая использует new для создания класса.

В этом случае оказывается, что GetList() использует new для создания нового списка.

0
ответ дан 8 December 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: