Установить объект на ноль, из списка - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть переменная, затем добавьте эту переменную в список.Если я установил для list [0] значение NULL, он просто удаляется из списка, а переменная по-прежнему не равна нулю.

И если я устанавливаю переменную в NULL, значение в списке остается ненулевым.

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

    var list = new List<String>();

    list.Add(s);

A:

    s = null;

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

B:

    list[0] = null;

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

Мой настоящий код намного сложнее с несколькими переменными и объектами, некоторые переменные содержат экземпляр одного и того же объекта(ни одна из них не является структурой), у каждого есть список со всеми объектами.

Выполнение 'list [0] = null' освобождает только 0-е место в этом списке вместо того, чтобы сделать этот объект нулевым, и я хочуобъект также должен быть установлен в null.

Я ожидал, что и A, и B сделают оба из них нулевыми.Может кто-нибудь объяснить, почему он так себя не ведет, и как заставить его так себя вести?

И поскольку в списке содержится ссылка на 's', почему s = null не меняет элемент списка нануль

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Как уже упоминалось в комментариях, 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
0 голосов
/ 14 февраля 2019

Когда вы добавляете 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;
...