Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
44 / 44 / 28
Регистрация: 06.07.2011
Сообщений: 353
1

Удаление объекта из листа, когда объект становится null

13.03.2016, 16:01. Показов 2068. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
Есть класс, допустим это клетка на поле
C#
1
2
3
4
5
6
7
8
class Foo
        {
            public ulong x;
            public ulong y;
            public List<Foo> neighbors;
 
            public Foo(ulong x, ulong y) { .. }
        }
У этой клетки есть соседние клетки.

Затем я создаю несколько клеток и связываю их:

C#
1
2
3
4
5
6
7
8
9
10
11
var a = new Foo(201, 201);
var b = new Foo(203, 199);
var c = new Foo(204, 199);
var d = new Foo(205, 199);
var e = new Foo(205, 200);
 
 
b.neighbors.Add(c);
c.neighbors.AddRange(new[] { b, e, d });
d.neighbors.AddRange(new[] { c, e });
e.neighbors.AddRange(new[] { a, c, d });
После этого, я хочу удалить клетку d

C#
1
2
d = null;
GC.Collect();
И, по моим ожиданиям, размер листов, у объектов c, e должен уменьшиться до 2. или хотябы 3 элемент должен быть null.
Но этого не происходит.

Что же я делаю не так? Необходимо при удалении объекта (=null) чтобы он занулился, в листах, у других объектов.
Необходимо решить задачку не перебирая каждую клетку в цикле. (те нужно пользоваться ссылками, как я понимаю)
(Ибо клеток может быть очень много, и каждую вот так перебирать..)

Возможно мне нужен не лист? Подскажите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2016, 16:01
Ответы с готовыми решениями:

Не создаётся объект когда один из параметров null
// создание объекта, 4-й параметр null - так ничего не происходит FRequest request = new...

Ссылка на объект не указывает на экземпляр объекта (dataGridView1 было null)
Делал программу по видео, там все нормально, у меня выдает ошибку....

Как проверить null или сылка на объект не указывает на экземпляр объекта
Здравствуйте!При отладке программа вылетает и выходит сообщение и указывает на эти строки: ...

Какое событие происходит когда в форме один объект входит в область другого объекта?
Добрый день форумчане. пытаюсь создать мини-игрульку в С#. В общем PictureBox движется по форме с...

3
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
13.03.2016, 16:09 2
Цитата Сообщение от objaa Посмотреть сообщение
И, по моим ожиданиям, размер листов, у объектов c, e должен уменьшиться до 2. или хотябы 3 элемент должен быть null.
На каком основании? Если вы где-то присвоили null какой-то ссылке на какой-то объект, это никак не повлияет на сам объект и другие ссылки на него. У сборщика тоже нет причин удалять объект, пока на него есть хоть одна живая ссылка. И уж тем более, у листа нет никаких причин из себя что-то удалять. Вы можете в классе клетки,например, ввести какое-нибудь свойство, а потом, когда вы обходите те листы, удалять из них клетки, у которых значение этого свойства соответствующее. Либо вообще менять принцип работы данного класса(я не знаю ТЗ, так что ничего тут не скажу)
0
44 / 44 / 28
Регистрация: 06.07.2011
Сообщений: 353
13.03.2016, 16:19  [ТС] 3
Я присвоил null объекту, ссылка на который есть в листе. А значит и в листе должен появиться null (ссылка никуда больше не ведет)
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
13.03.2016, 16:56 4
objaa, вы присвоили null не объекту, а ссылке. Объекту вы ничего присвоить таки образом не можете, вы его можете его только создать и менять внутри созданного объекта какие-то поля. А присвоение ссылке null-означает лишь то, что ссылка больше ни на что не ссылается. На сам объект это никак не повлияло-он остался существовать в памяти, и все другие ссылки продолжают работать. А сборщик удалит его только тогда, когда на него не останется ни одной ссылки. Вот вам наглядный пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
 
namespace ConsoleApplication77
{
    class Program
    {
        class MyClass
        {
            public int x=666;
        }
        static void Main(string[] args)
        {
            MyClass ref1 = new MyClass();//создали объект и ссылку на него ref1
            MyClass ref2 = ref1;//создали еще одну ссылку на тот же объект
            ref1 = null; //присвоили первой ссылке null. Объект никак не изменился.
            Console.WriteLine(ref2.x); // Выведет 666. Обратились к объекту по второй ссылке и вывели значение поле x на экран.
            Console.WriteLine(ref1.x); // Вылетит с NullReferenceException. Ссылка больше ни на что не указывает.
            Console.Read();
        }
    }
}
Добавлено через 3 минуты
С тем же успехом вы могли бы написать вместо ref1 = null; , допустим, ref1 = new MyClass(); . Объект бы тоже от этого никак не изменился-просто теперь первая и вторая ссылка указывали бы на разные объекты.
0
13.03.2016, 16:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2016, 16:56
Помогаю со студенческими работами здесь

Удаление из XML фаила Node: Ссылка на объект не указывает на экземпляр объекта
Помогите устранить ошибку &quot;Ссылка на объект не указывает на экземпляр объекта.&quot; В программе...

Сервер отправляет объект не null, а клиент принимает null
Помогите пожалуйста! У меня в клиент-серверном приложении творится что-то странное! Короче с...

Публичная переменная становится не null
Доброго времени суток 1. у меня есть класс Item в котором содержатся переменные названия,...

После вывода из php js кода он становится null/undefined
&lt;script&gt; var categoryId = &lt;?=$item?&gt;; document.getElementById(&quot;category&quot;).value =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru