我尝试在C#中合并集合定义和集合初始化器,但是无法初始化集合。请参见代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ListEX : MonoBehaviour
{
public List<string> sList = new List<string>()
{
"A", "B", "C", "D",
};
void Start()
{
sList.Add("X");
sList.Add("Y");
string str = "";
foreach (string i in sList)
{
str += i;
}
print(str);
}
str的输出是“XY”而不是“ABCDXY”,这让我很困惑,当我试用数组和字典时,同样的问题也发生在它们身上。
我假设我在集合初始化器的作用域中犯了一个错误。所以,我尝试将集合初始化器与集合定义分离。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ListEX : MonoBehaviour
{
public List<string> sList;
void Start()
{
sList = new List<string>()
{
"A", "B", "C", "D",
};
sList.Add("X");
sList.Add("Y");
string str = "";
foreach (string i in sList)
{
str += i;
}
print(str);
}
str的输出是“ABCDXY”,这符合我的预期,我的想法似乎被证明是正确的,但我仍然无法解释C#如何处理这一点的原理。
如果有人能给予我一个解释,我将不胜感激。
1条答案
按热度按时间u0njafvf1#
这是一个Unity MonoBehaviour脚本,默认情况下,公共字段(在这个问题中为
sList
)可以在一个名为inspector的窗口中编辑,这些字段的值在初始时将为deserialized,C#与此无关,这就是为什么当Start
运行时会得到一个空列表。如果要测试集合初始值设定项并避免受到序列化的影响,可以将访问修饰符更改为private,或者使用
NonSerialized
属性。顺便说一句,同样的问题不应该发生在
Dictionary<K,V>
上,因为它不是Unity的可序列化类型,如果字典类型有问题,请提供有问题的代码。