Я хорошо разбираюсь в языке C #, зная , как делать вещи без особого понимания , почему . Сегодня я заметил, что я обычно добавляю ключевое слово new
при инициализации списка (например, public List<Foo> foos = new List<Foo>();
), не понимая, почему я делаю инициализацию в первую очередь. Это только пробудило мое любопытство, и я должен был прийти сюда и спросить ( после поиска, конечно, ).
Я попытался просто объявить список
public List<Foo> foos;
, и это сработалопросто отлично с моим кодом, так почему меня учили всегда инициализировать списки ключевым словом new
?
В чем разница?
Я предполагаю, что это связано с распределением памяти, но опять же, у меня есть элементарныйпонимание таких вещей.
решено: @ Ответ JOSEFtw ниже продемонстрировал, что компилятор Unity автоматически инициализирует список, который просто объявляется с public List<Foo> foos;
. Это меня перепутало, и где-нибудь за пределами Unity будет выдано исключение NullReferenceException, если вы не инициализируете список.
EDIT: @UnholySheep попросил минимальный воспроизводимый пример вкомментарии. Поработав там с форматированием, я решил добавить его здесь:
public class ListManager : MonoBehaviour
{
public List<int> ints;
public void AddInt(int i)
{
ints.Add(i);
}
void Start()
{
AddInt(3);
AddInt(6);
AddInt(9);
foreach (int i in ints)
Debug.Log($"Int {ints.IndexOf(i) + 1} is {i}");
}
}
Для меня это дает результат:
Int 1 is 3
Int 2 is 6
Int 3 is 9
, хотя следует ожидать исключения NullReferenceException.
Это использует компилятор Unity, поэтому public List<int> ints;
работает так же, как public List<int> ints = new List<int>();
. Возможно, это просто компилятор, делающий вещи в фоновом режиме? Для тех, кто не знаком с Unity, Debug.Log
похож на Console.WriteLine
и void Start()
похож на void main()
.