我对C#语言有基本的了解,知道如何做事却对为什么不太了解。今天我注意到,在初始化列表(例如new
)时,我习惯性地添加了public List<Foo> foos = new List<Foo>();
关键字,却没有意识到为什么要首先进行初始化。这只是激起了我的好奇心,我不得不来这里问(当然是在搜索之后)。
我尝试过简单地声明列表
public List<Foo> foos;
并且它与我的代码配合得很好,所以为什么要教我总是使用new
关键字初始化列表?有什么区别?我认为这与分配内存有关,但是我还是对这些东西有基本的了解。
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()
。
编辑:现在,我看到您正在使用Unity。看看这个答案:https://gamedev.stackexchange.com/questions/129345/do-i-need-to-initialize-a-public-list-variable-in-unity
Unity的编辑器在生成游戏时自动创建新的List()部分