Почему значение, которое я присвоил переменной, исчезло? - PullRequest
0 голосов
/ 02 декабря 2018

Я присвоил значение variableA другой форме variableB.Почему обе переменные пусты после этого я очищаю variableA?

Before execute entries.clear()

enter image description here

After execute entries.clear()

enter image description here

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Я не уверен насчет типа данных записей, но если переменная записей является DataTable, пожалуйста, начните использовать как:

в блоке if

frm5.entries = entries.Copy();

в блоке else

frm5.entries1 = entries.Copy();

Это позволит решить вашу проблему.

0 голосов
/ 02 декабря 2018

Попробуйте frm5.entries = records.ToArray ();это скопирует вашу коллекцию.Я думаю, что теперь вы копируете ссылку, а не значение.Запуск Clear () для одной переменной приводит к тому, что другой также будет пустым, поскольку он указывает на тот же пробел в памяти.

0 голосов
/ 02 декабря 2018

Кажется, что entries - это коллекция, массив или List, или какой-то другой.

В любом случае, все они называются классами, и вы можете создавать экземпляры этих классов.Эти объекты тогда являются ссылочными типами , что означает, что переменная содержит только ссылку на память, где объект "запоминается".Поэтому, когда вы присваиваете свою переменную другой переменной, эта другая переменная также содержит только ссылку на ту же самую память.

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

Я предлагаю вам ознакомиться с этим для лучшего понимания.Например: Глубокое погружение: значения и ссылочные типы в .Net

0 голосов
/ 02 декабря 2018

И frm5.entries, и entries относятся к одному и тому же объекту, так как ранее этот код:

frm5.entries = entries;

Значение каждой переменной здесь - это просто ссылка наобъект - как две бумажки с одинаковым домашним адресом.Ваш звонок по номеру entries.Clear() все равно что сказать: «Идите в дом с адресом, написанным на листке бумаги под названием entries, и уберите всю мебель».Если вы затем пойдете в дом с адресом, написанным на листе бумаги под названием frm5.entries, вы увидите пустой дом.

Так работают ссылочные типы в .NET, и это важно понять это, чтобы добиться прогресса на любом языке .NET.У меня есть страница по теме с гораздо более подробной информацией, и есть вопрос переполнения стека , который вы также можете найти полезным.

Вот пример, демонстрирующий эту мысль:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        List<string> x = new List<string>();
        List<string> y = x;
        // x and y now refer to the same list...

        x.Add("foo");
        Console.WriteLine(y.Count); // 1

        y.Clear();
        Console.WriteLine(x.Count); // 0

        // Changing x or y to refer to a different list
        // *doesn't* change the other variable
        x = new List<string>();
        x.Add("bar");
        x.Add("baz");

        Console.WriteLine(y.Count); // 0
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...