unity3d 集合初始值设定项不适用于集合定义

pod7payv  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(140)

我尝试在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#如何处理这一点的原理。

如果有人能给予我一个解释,我将不胜感激。

u0njafvf

u0njafvf1#

这是一个Unity MonoBehaviour脚本,默认情况下,公共字段(在这个问题中为sList)可以在一个名为inspector的窗口中编辑,这些字段的值在初始时将为deserialized,C#与此无关,这就是为什么当Start运行时会得到一个空列表。
如果要测试集合初始值设定项并避免受到序列化的影响,可以将访问修饰符更改为private,或者使用NonSerialized属性。

public class ListEX : MonoBehaviour
{
    private List<string> sList = new List<string>()
    {
        "A", "B", "C", "D",
    };

    [System.NonSerialized]
    public List<string> sList2 = new List<string>()
    {
        "A", "B", "C", "D",
    };
}

顺便说一句,同样的问题不应该发生在Dictionary<K,V>上,因为它不是Unity的可序列化类型,如果字典类型有问题,请提供有问题的代码。

相关问题