将对象设置为 null,来自列表

Set object to null, from list

我有一个变量,然后将该变量添加到列表中。如果我将 list[0] 设置为 null,它只是从列表中删除并且变量仍然不为 null。

如果我将变量设置为 null,列表中的变量将不为 null。

    var s = new String("Test".ToCharArray()); //Example of class

    var list = new List<String>();

    list.Add(s);

答:

    s = null;

    Debug.Log( list[0] ); //Test
    Debug.Log( s ); //Null

乙:

    list[0] = null;

    Debug.Log( list[0] ); //Null
    Debug.Log( s ); //Test

我的实际代码复杂得多,有多个变量和对象,一些变量持有同一个对象的实例(都不是结构),一个有一个包含所有对象的列表。

执行 'list[0] = null' 只会清空该列表中的第 0 个位置,而不是使该对象为空,我希望该对象也设置为空。

我预计 A 和 B 都会使它们都为空。有人可以解释为什么它不那样做,以及如何让它那样做吗?

并且由于列表包含对 's' 的引用,为什么 's = null' 不将列表项更改为空?

当您将 string 添加到 List 时,您只是在传递项目的值,而不是对象本身。 一种方法是将 string 包裹在另一个对象中:

public class wrapper
{
    public string Str{get; set;}
    public wrapper(str s)
    {
        Str = s;
    }

}

通过使用这个对象,如果你更新对象的 Str 属性,那么它也会在 List 中改变,因为列表指向这个class 其中包含值。

这是您的示例,但正在使用中。

var s = new Wrapper("Buzz");
var l = new List<Wrapper>();
l.Add(s);

s.Str = null;

如评论中所述,这不是 C# 的工作方式。特别是,C# 不允许直接存储对对象的引用,只能作为另一个对象的一部分。因此,以下将起作用:

class Variable<T>
{
   public Variable(T value) { Value = value; }
   public T Value { get; set; }
}

var s = new Variable<string>("Test");
var list = new List<Variable<string>>();

list.Add(s);

那么你有一个

s.Value = null;

Debug.Log( list[0].Value ); //Null
Debug.Log( s.Value ); //Null

和乙

list[0].Value = null;

Debug.Log( list[0].Value ); //Null
Debug.Log( s.Value ); //Null