Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658

Магия использования статического класса

13.01.2020, 00:18. Показов 2248. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть задачи:
У меня хранятся данные в текстовом файле 1500 записей для работы приложения.
Чтобы не считывать их каждые 50 милисекунд из файла было принято решение считывать их единожды и записывать в статический класс.
Но каким-то чудесным образом из статического элемента класса при выполнении метода!!! Удаляются элементы, без прямого взаимодействия на них!!!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public static List<Type> DELETE_ELEMENT(List<NOBL> DELETE_DATA,List<TYPE> ELEMENTS)
        {
            //удаление элементов
            ELEMENTS.RemoveAll(x => compare(x.INDEX, DELETE_DATA)); 
            return ELEMENTS;
        }
    public class GLOBAL_DATA
    {
        public static List<TYPE> PRECALC_DATA;
        public List<TYPE> PRECALC_READ_DATA()
        {
            //ЧТЕНИЕ ИЗ ФАЙЛА И ЗАПИСЬ В PRECALC_DATA;
            return PRECALC_DATA;
        }
    }
        public static List<TYPE> WORK(List<NOBL> DELETE_DATA)
        {
            //Основной вызываемый метод.
            return DELETE_ELEMENT(DELETE_DATA,GLOBAL_DATA.PRECALC_DATA);
        }
Как сделать чтобы данные в PRECALC_DATA не менялись при выполнении кода???
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2020, 00:18
Ответы с готовыми решениями:

Ошибка при вызове статического конструктора статического класса
Здравствуйте! Проблема в следующем: Есть класс public static class 1 { static Point arr; public static...

Магия класса Random'a
Делать было нечего, стал развлекаться с Random'ом, 1.Есть 3 цикла( Рандомлю до тех пор пока не вырандомится &quot;1&quot;); 2.Еще 1...

Вызов метода из статического класса
Как говорится, есть два класса - Tweet и статичный класс StringHelper. В одном константа точеная(textLength), в другом метод копченый по...

19
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
13.01.2020, 00:34
Цитата Сообщение от koc94ok Посмотреть сообщение
Как сделать чтобы данные в PRECALC_DATA не менялись при выполнении кода???
Объявить их readonly. Ваш КЭП.

C#
1
public static readonly List<TYPE> PRECALC_DATA;
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.01.2020, 00:45  [ТС]
freeba, а при свойстве readonly залить данные в переменную изначально возможно при чтении файла? Хотябы изнутри этого же статичного класса????
См. ниже:
C#
1
GLOBAL_DATA.PRECALC_DATA = PRECALC_READ_DATA();
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
13.01.2020, 01:20
Цитата Сообщение от koc94ok Посмотреть сообщение
Удаляются элементы, без прямого взаимодействия на них!!!
Вы же их сами удаляете... И readonly тут не поможет.

Добавлено через 5 минут
Можете каждый раз создавать копию списка и передавать его дальше в методы...
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
13.01.2020, 01:23
koc94ok, Почитайте описание readonly - он не исправит косяков в коде, но укажет на них более явно
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.01.2020, 01:24  [ТС]
Someone007, В том то и дело, я статичный класс ТОЛЬКО вызываю, ничего ему не присваивая!!! Создавал копию, происходит тоже самое...
НО! Если каждую итерацию читать файл с диска, без каких-либо статических классов - то все отлично.
Первый раз в жизни использую статический класс и не понимаю что вообще происходит.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
13.01.2020, 01:28
Цитата Сообщение от koc94ok Посмотреть сообщение
В том то и дело, я статичный класс ТОЛЬКО вызываю, ничего ему не присваивая!!! Создавал копию, происходит тоже самое...
Вы передаете ссылку на список, который хранится в статическом классе в метод, а в методе у вас происходит удаление из списка, который вы передали... По моему все логично...

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static List<Type> DELETE_ELEMENT(List<NOBL> DELETE_DATA,List<TYPE> ELEMENTS)
{
    //удаление элементов
    ELEMENTS.RemoveAll(x => compare(x.INDEX, DELETE_DATA)); 
    return ELEMENTS;
}
 
public class GLOBAL_DATA
{
    public static List<TYPE> PRECALC_DATA;
    public List<TYPE> PRECALC_READ_DATA()
    {
        //ЧТЕНИЕ ИЗ ФАЙЛА И ЗАПИСЬ В PRECALC_DATA;
        return PRECALC_DATA;
    }
}
 
public static List<TYPE> WORK(List<NOBL> DELETE_DATA)
{
    //Основной вызываемый метод.
     return DELETE_ELEMENT(DELETE_DATA, new List<TYPE>(GLOBAL_DATA.PRECALC_DATA)); // создаем копию списка  и передаем в метод
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2020, 01:31
Цитата Сообщение от koc94ok Посмотреть сообщение
Первый раз в жизни использую статический класс и не понимаю что вообще происходит
Статические методы тут вообще не при делах, то же самое будет наблюдаться и не в статических методах, если передавать ссылку на тот же самый список.
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.01.2020, 01:33  [ТС]
Someone007, Хорошо, я понял что зря связался со статическими классами. Может быть вы подскажете как еще можно при запуске программы загрузить данные из файла, чтобы они были доступны всем классам приложения для чтения (и не изменялись)???
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2020, 01:34
Цитата Сообщение от koc94ok Посмотреть сообщение
(и не изменялись)
Так не изменяйте их — они и не будут изменяться!
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
13.01.2020, 01:35
Цитата Сообщение от koc94ok Посмотреть сообщение
Может быть вы подскажете как еще можно при запуске программы загрузить данные из файла, чтобы они были доступны всем классам приложения для чтения (и не изменялись)???
Они доступны для чтения и не меняются, если вы их сами не будете менять...
В вашем случае только с копией работать, т.к. у вас логика работы такая... Либо менять алгоритм работы...
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.01.2020, 01:37  [ТС]
kolorotur, Я не присваиваю никаких значений, как вообще переменная может меняться без присваивания???
C#
1
2
3
4
5
6
public static List<TYPE> WORK(List<NOBL> DELETE_DATA)
{
    //Основной вызываемый метод.
     List<TYPE> BUFFER = GLOBAL_DATA.PRECALC_DATA;
     return DELETE_ELEMENT(DELETE_DATA, BUFFER); // создаем копию списка  и передаем в метод
}
Передаю значения через буфер, происходит все тоже самое...
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
13.01.2020, 01:41
Цитата Сообщение от koc94ok Посмотреть сообщение
Передаю значения через буфер, происходит все тоже самое...
Конечно, прочитайте про ссылочные типы. Этот код от кода в 1 посте ничем не отличается. То что вы создали локальную переменную, в которой у вас по прежнему ссылка на тот же самый список, никак не изменит результат.

Добавлено через 2 минуты
Цитата Сообщение от koc94ok Посмотреть сообщение
Я не присваиваю никаких значений, как вообще переменная может меняться без присваивания???
Переменная не меняется, меняется содержимое списка. Это разные вещи.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
13.01.2020, 01:42  [ТС]
Someone007, Каким образом тогда создать копию? Копировать каждый элемент списка в локальную переменную?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
13.01.2020, 01:42
Цитата Сообщение от koc94ok Посмотреть сообщение
Каким образом тогда создать копию? Копировать каждый элемент списка в локальную переменную?
В 7 посте создается копия списка...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2020, 01:44
Цитата Сообщение от koc94ok Посмотреть сообщение
Я не присваиваю никаких значений
Ну как же не присваиваете, если вы на 19-й строке этот список передаете в метод DELETE_ELEMENT вторым аргументом, а потом в этом методе удаляете оттуда элементы на 4-й строке?

Цитата Сообщение от koc94ok Посмотреть сообщение
Передаю значения через буфер
Вы не передаете значение через буфер.
Вы, грубо говоря, создаете копию ярлыка на файл, открываете файл через этот ярлык и удаляете его содержимое.
Второй ярлык — это не буфер, это ярлык на тот же файл.
Так и у вас — вторая переменная — это не новый список, а другая ссылка на тот же самый.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,071
Записей в блоге: 2
13.01.2020, 01:59
Цитата Сообщение от koc94ok Посмотреть сообщение
Чтобы не считывать их каждые 50 милисекунд из файла было принято решение считывать их единожды и записывать в статический класс.
Измените реализацию статического свойства хранящего список на неизменяемый массив
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class GLOBAL_DATA
{
    public static readonly   ImmutableArray<TYPE> PRECALC_DATA;
   
 // Конструктор инициализирующий свойство
  static GLOBAL_DATA()
{
    List<TYPE> list = new List<TYPE>();
    /// Получение данных из файла
    /// и заполнение ими списка list
 
 
      PRECALC_DATA = list.ToImmutableArray(); // Единоразовая запись неизменяемого списка
}
 
}
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
13.01.2020, 02:03
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Измените реализацию статического свойства хранящего список на неизменяемый массив
Вангую вопрос почему я не могу удалить элементы из списка, как теперь использовать RemoveAll или что-то подобное...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,071
Записей в блоге: 2
13.01.2020, 02:06
Цитата Сообщение от koc94ok Посмотреть сообщение
Я не присваиваю никаких значений, как вообще переменная может меняться без присваивания???
Реализация метода должна быть иная
C#
1
2
3
4
5
6
7
        public static List<TYPE> WORK(List<NOBL> DELETE_DATA)
                  => GLOBAL_DATA.PRECALC_DATA.Where(x => !compare(x.INDEX, DELETE_DATA)).ToList();
  //      {
              //Основной вызываемый метод.
 //           List<TYPE> BUFFER = GLOBAL_DATA.PRECALC_DATA;
 //          return DELETE_ELEMENT(DELETE_DATA, BUFFER); // создаем копию списка  и передаем в метод
      }
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
19.01.2020, 14:47  [ТС]
Элд Хасп, Someone007, kolorotur, Всем спасибо за помощь.

Someone007, Пример из 7 поста не решает проблему. Сам список новый, но ссылки на его элементы так и остаются (дошел до этого опытным путем).

Сделал функцию "глубокого" копирования списка List и все отлично функционирует.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2020, 14:47
Помогаю со студенческими работами здесь

Вызов метода статического класса из сборки
Как вызвать метод статического класса из сборки? Сборку я подгрузил, а дальше?

Использование публичного статического класса внутри абстрактного
Всем привет! Чувствую, истина где-то близко. Морской бой! Есть корабли. &quot;Air Carrier&quot; это 5-и палубный корабль. У меня есть...

Когда вызывается статический конструктор у статического класса?
ох lol, собственно: Когда вызывается статический конструктор у статического класса? и как передать в него параметры? :D

Присвоение переменной из статического класса значения из формы
здравствуйте, у меня есть static class Data, в котором имеется: public static int N; public static float inputSnakeRow = new float; ...

Рефлексия, получить содержание поля статического класса
static class Messange { public static readonly string mes = &quot;Привет&quot;; } необходимо только по имени...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru