Зачем инициализировать списки новым ключевым словом, а не просто объявлять их? - PullRequest
0 голосов
/ 13 октября 2019

Я хорошо разбираюсь в языке 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().

1 Ответ

0 голосов
/ 13 октября 2019

РЕДАКТИРОВАТЬ: Теперь я вижу, что вы используете Unity. Посмотрите на этот ответ: https://gamedev.stackexchange.com/a/129346

Редактор Unity автоматически создает новую часть List () при создании игры

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

using System;
using System.Collections.Generic;

public class Program
{
    public static List<string> MyList;
    public static void Main()
    {
        MyList.Add("boom");
    }
}

Будет выдано следующее сообщение об ошибке, если вы попытаетесь использовать его без инициализации:

System.NullReferenceException: Object reference not set to an instance of an object.

Я создал для вас скрипку, которая показываетчто произойдет, если вы запустите код: https://dotnetfiddle.net/dUlxo6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...