集合初始化器不适用于集合定义

问题描述 投票:0回答:1

我尝试在 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# 的工作原理。

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

c# unity3d collections initializer
1个回答
0
投票

这是一个Unity MonoBehaviour脚本,默认情况下公共字段(

sList
在这个问题中)可以在一个名为inspector的窗口中编辑,这些字段的值将在初始时被反序列化,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的可序列化类型,如果字典类型有问题,请提供问题代码。

© www.soinside.com 2019 - 2024. All rights reserved.