【问题标题】:Set object to null, from list从列表中将对象设置为空
【发布时间】:2019-02-14 07:27:39
【问题描述】:

我有一个变量,然后将该变量添加到列表中。如果我将 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 都会使它们都为 null。有人可以解释为什么它不这样,以及如何让它这样吗?

既然列表包含对 's' 的引用,为什么 's = null' 不会将列表项更改为 null?

【问题讨论】:

  • 这不是 C# 的工作方式。对不起。
  • 那么有没有类似于指针数组的类型,我可以将指针保存在列表中,以便我可以从列表中更改该对象的实际值?
  • 您有两个变量来承载对对象的引用。引用变量只是保存一个值的变量,该值是对对象所在内存的“引用”。当您将一个变量设置为 null 时,您只是更改了该变量的值,而不是另一个变量的值
  • 我认为的问题是字符串是按值而不是引用传递的,因此列表仍然具有相同的值。

标签: c# arraylist ref


【解决方案1】:

正如 cmets 中所述,这不是 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);

那么你有A

s.Value = null;

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

和B

list[0].Value = null;

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

【讨论】:

  • T 是一个属性而不仅仅是一个变量的任何特殊原因?
  • @LukaKostic 如果愿意,您可以将其设为字段,但出于多种原因,最好选择属性而不是字段。
【解决方案2】:

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

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

}

通过使用此对象,如果您更新对象的Str 属性,那么它也将在List 中更改,因为列表指向包含该值的此类。

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

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

s.Str = null;

【讨论】:

  • Str 需要是一个属性还是只是一个“公共字符串 Str;” , Str 必须是结构还是类?
  • 不需要是一个属性,我相信它可以是一个结构。
  • 如果我的类 'MyClass' 有多个变量和构造函数参数,我做 'var s = new Wrapper(new MyClass(arg1,arg2));' ?或者's.Str = null'会和我的问题一样吗
  • 如果我使用结构(用于 Str 变量),那么在初始构造后我无法对其进行编辑,因为它会给出错误“无法修改返回值.. 因为它不是变量”。如果我使用一个类 'public MyClass Str' 如果我将它设置为 null 's.Str = null' 它的行为与我的问题代码相同。这就是为什么我问它是否可以成为一堂课。
  • 你是否需要使用结构体,并且可以通过具有多个值和构造函数参数来做你所说的,这很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 2015-05-25
  • 2015-02-16
相关资源
最近更新 更多