Здесь, в этой части, вам действительно нужно:
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]]
}
})
В вашем сценарии кажется, что фактическое создание объекта выполняется внутри вашего GetList ()
метод. Таким образом, ваш первый пример будет правильным.
При создании ваш список
хранится в куче, а ваш listCustClass
просто является ссылкой на этот новый объект. , Когда для listCustClass установлено значение GetList ()
, указатель ссылки listCustClass
отбрасывается и заменяется указателем ссылки на то, что GetList ()
возвращает (может быть нулевым) , Когда это происходит, ваш оригинальный List
все еще находится в куче, но никакие объекты не указывают на него, поэтому он просто тратит ресурсы, пока не соберется сборщик мусора и не очистит его.
Во втором случае вы создаете новый объект в первой строке, чтобы просто выбросить его во вторую строку. Совершенно ненужно.
Только ваш первый пример имеет смысл в этом случае, так как во втором случае вы немедленно заменяете созданный список на один вернулся по методу. Инициализация списка в новый пустой список имеет смысл в тех случаях, когда вы добавляете в этот список или когда существует вероятность того, что метод, который вы вызываете для заполнения списка, может каким-то образом привести к нулевому значению, если в противном случае вы ожидаете пустой список .
Примеры, где я мог бы использовать инициализацию для нового, пустого списка.
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
listCustClass.AddRange( GetList() );
или
List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
Вы используете ключевое слово new
для создания нового экземпляра объекта. Из вашего вопроса не ясно, что делает метод GetList
, но, вероятно, он либо создает новый список (таким образом перемещая ключевое слово new
в другое место), либо возвращает существующий список (который кто-то создал в одной точке, используя new
).
Если вы можете вставить это без потери смысла и ясности того, что вы делаете, во что бы то ни стало, встроенным.
Редактировать: И, как я регулярно подчеркивал, я даже не думал о ссылке на осиротевший объект. Doh. =)
Новое ключевое слово в основном используется для выделения места в куче. Если вы создаете тип значения (структуры и т. Д.), Вам не нужно использовать ключевое слово new. Однако ссылочные переменные должны быть new'd, прежде чем они будут использованы.
В приведенном выше примере кажется, что GetList () возвращает ссылку, которая имеет тип List, который был бы создан (new'd) где-то в функции. Следовательно, в этом сценарии новое бессмысленно.
Эмпирическое правило отсутствует, но есть здравый смысл, который вы можете применять большую часть времени.
Объект должен быть создан при создании. Ваша функция GetList ()
якобы возвращает (созданный) IList, поэтому второй фрагмент кода совершенно не нужен (вы создаете экземпляр IList и фактически удаляете его на следующей строке).
Однако первый фрагмент полностью уместен.
Не думайте об этом с точки зрения «должен ли я использовать новый, когда я объявляю».
Вы используете new, когда вы присваиваете (что может быть частью объявления).
Первый пример верный, второй - ненужная трата ресурсов времени выполнения.
В C# все экземпляры классов должны быть созданы с помощью ключевого слова new
. Если вы не используете new
в текущем контексте, у вас либо есть нулевая ссылка, либо вы вызываете функцию, которая использует new
для создания класса.
В этом случае оказывается, что GetList() использует new
для создания нового списка.