«Новому» или не «новому» - PullRequest
6 голосов
/ 20 апреля 2009

Существует ли практическое правило, когда следует использовать ключевое слово new, а когда - при объявлении объектов?

List<MyCustomClass> listCustClass = GetList();

OR

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

Ответы [ 9 ]

43 голосов
/ 20 апреля 2009

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

18 голосов
/ 20 апреля 2009

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

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

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

или

List<MyCustomClass> listCustClass = new List<MyCustomClass>();
try
{
    listCustClass = GetList();
}
catch (SqlException)
{
}
return listCustClass;
8 голосов
/ 20 апреля 2009

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

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

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

3 голосов
/ 20 апреля 2009

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

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

3 голосов
/ 20 апреля 2009

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

2 голосов
/ 20 апреля 2009

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

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

1 голос
/ 20 апреля 2009

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

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

Впрочем, первый фрагмент полностью уместен.

0 голосов
/ 20 апреля 2009

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

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

0 голосов
/ 20 апреля 2009

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

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

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

...