Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Результаты опроса: Вопрос в заголовке темы
Только такие коллекции и нужны, все эти сборщики мусора - говно! 0 0%
Нужны в некоторых случаях 0 0%
Категорически не нужны 10 100.00%
Нужны, но быдлокодеры стесняются об этом заявить 0 0%
Голосовавшие: 10. Вы ещё не голосовали в этом опросе

 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14

Нужны ли в современном C# такие коллекции, как "двумерный нативный массив/список" или "нативный массив/список строк"?

28.09.2025, 15:53. Показов 5095. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как известно, в управляемых языках с автоматическим сборщиком мусора, таких как C#, исключено переполнение буфера, как в C/C++ (если принудительно его не включать, что даже доступно не во всех языках, хотя в C# доступно), и главная проблема, непрерывно преследующая программистов - постоянные утечки памяти из-за ошибок этого самого сборщика мусора, приводящие к вылету из-за переполнения. Мы в Red-Star-Soft уже частично решили эту проблему, создав коллекции "нативный список" и "нативная строка", которые освобождают память, когда захочет программист, а не сборщик мусора, но проблема в том, что сами эти коллекции являются классами, а значит, напрямую создать нативный список нативных списков или нативный список строк уже не получится, нужна отдельная коллекция с другой архитектурой, создать которую не просто. Вот я и спрашиваю, стоит создавать такую коллекцию, тратить на нее время и флопы мозга (точнее, даже две коллекции - одна вместо массива массивов, списка массивов, массива списков и списка списков, другая вместо массива строк и списка строк) или вам нравится, что сборщик мусора решает за вас? Сразу предупреждаю, мнения известных троллей, таких как Usaga и Катафалк, учтены не будут - в опросе они "растворятся" в общей массе голосов, а в обсуждении ники видны, и сообщения под этими никами будут проигнорированы.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.09.2025, 15:53
Ответы с готовыми решениями:

Удаление элемента коллекции в коллекции коллекции )
Есть коллекция (к1), в ней элементы + коллекция (к2), Так вот в к2 тоже есть элементы, и из к2 надо...

Как удалить элемент из коллекции, во время перебора этой коллекции foreach?
Прив. Смотрите что. Есть сервер, на нем 2 класса - Server & ClientConnection. При подключении...

Доступ из элемента коллекции к другим элементам коллекции
Подскажите как получить данные из другого элемента коллекции? В приведенном примере необходимо...

29
Эксперт .NET
 Аватар для Usaga
14578 / 9484 / 1360
Регистрация: 21.01.2016
Сообщений: 35,776
02.10.2025, 16:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от golosalex Посмотреть сообщение
это как-то убрать ограничение на длину индекса
При этом было бы не плохо ещё определиться "зачем")
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
03.10.2025, 02:43
Цитата Сообщение от Usaga Посмотреть сообщение
При этом было бы не плохо ещё определиться "зачем")
например для справочника простых чисел) чем больше тем лучше...
0
Эксперт .NET
 Аватар для Usaga
14578 / 9484 / 1360
Регистрация: 21.01.2016
Сообщений: 35,776
03.10.2025, 02:48
golosalex, а существующими средствами справочник простых чисел не делается?)
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
03.10.2025, 05:29
Цитата Сообщение от Usaga Посмотреть сообщение
а существующими средствами справочник простых чисел не делается?)
Какой-нибудь список умеющий в индексацию по long думаю нет-нет, да и требуется. Скажем для того же блокчейна, где нужно максимально быстро иметь доступ к информации по адресу, если использовать обычный словарь, то очень быстро упрёшься в лимит int.MaxValue.

Я правда не уверен что с такими требования C# в целом удачный выбор.
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
03.10.2025, 09:13
Цитата Сообщение от Usaga Посмотреть сообщение
golosalex, а существующими средствами справочник простых чисел не делается?)
чем больше простых чисел под рукой тем лучше)))

вот другой пример: сериализация в массив байт для передачи по сети. вот тут точно время от времени получаются огромные составные объекты и приходится что-то изобретать.

с другой стороны имеются скорее всего препятствия на уровне ассемблера чтобы массивы с лонг индексами работали быстро, так что имеем что имеем)
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
03.10.2025, 09:16
Цитата Сообщение от golosalex Посмотреть сообщение
вот другой пример: сериализация в массив байт для передачи по сети. вот тут точно время от времени получаются огромные составные объекты и приходится что-то изобретать.
По сети предавать long-list? Зачем?!
0
Эксперт .NET
 Аватар для Usaga
14578 / 9484 / 1360
Регистрация: 21.01.2016
Сообщений: 35,776
03.10.2025, 09:26
Цитата Сообщение от golosalex Посмотреть сообщение
с другой стороны имеются скорее всего препятствия на уровне ассемблера чтобы массивы с лонг индексами работали быстро, так что имеем что имеем)
Единственное препятствие - наличие памяти под этот массив.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
05.10.2025, 13:50
Лучший ответ Сообщение было отмечено Etyuhibosecyu как решение

Решение

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
или вам нравится, что сборщик мусора решает за вас?
Если поискать по интернету (самому лень сейчас), то можно найти тесты различных способов управления памятью.
Для обычного компа (на микроконтроллерах, например, это может оказаться не так) сборщик мусора .Net в общем случае показал наилучшую эффективность.
Кроме того, для уникальных случаев, когда требуется более тонкий контроль, есть слабые ссылки, есть таблица со слабыми ссылками, есть финализаторы и интерфейс IDisposable (и рекомендации по его реализации).

Я О-О-О-О-О-О-Очень сомневаюсь, что можно что-то кастомное создать более эффективное чем всё это.

Добавлено через 1 минуту
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Нативный список основан на простых указателях (не управляемых), а не на массиве, а указатели могут быть освобождены моментально, не дожидаясь, когда заведется сборщик мусора.
Зачем?
В среднем, для общего случая, это приведёт к замедлению приложения.

Добавлено через 1 минуту
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
как справляетесь с утечками памяти, если, например, нужно выполнить сложные преобразования одной коллекции в другую, более сложные, чем LINQ-методы?
А как они там, вообще, могут возникнуть?
Для этого надо очень сильно постараться и задаться такой целью.

Добавлено через 1 минуту
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Конкретный пример: разбить изображение на пикселы,...
А утечки памяти причём здесь?
Такое ощущение, что вы под ними подразумеваете нечто иное чем другие разработчики.

Добавлено через 2 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Если да, то некоторые объекты он упорно не желает удалять - это разве не ошибка?
Удалит, если на них нет сильных ссылок, когда у системы будет на это свободное время.
"Сборка мусора" - это очень затратная операция. И если её вызывать "на каждый чих", то это может значительно замедлить не только приложение, но и в целом весь комп тормозить.

Добавлено через 5 минут
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
либо разрабатывать двумерный список, самоуничтожающийся сразу при вызове Dispose(), либо, если это никому не нужно, я не буду разрабатывать.
Что такое "самоуничтожающийся"? Даже если он никому не нужен (нет сильных ссылок на него) он всё равно будет висеть в памяти.
Чтобы это пространство "скинуть" в пул свободного места системы, для распределение по новым запросам, то мало просто отправить ссылку на него.
Надо ещё сдвинуть все объекты используемые процессом, а это приводит в переписыванию всех ссылок на них.
Это очень затратно.
Поэтому пусть висит в памяти, пока их не наберётся много и потом одним разом Сборщик Мусора всё это сделает.

Добавлено через 10 минут
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
двумерный нативный массив
Кстати, в .Net простые массивы типа T[,,..] независимо от от размерности - все нативные.
.Net оболочка этих массивов просто предоставляет доступ к нативному коду этих массивов.
2
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
05.10.2025, 17:51
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что такое "самоуничтожающийся"?
У ТС-а все еще проблемы с мат.частью, ведь IDisposable ничего общего не имеет с полным освобождением памяти объекта.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
08.10.2025, 08:25
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Кстати, в .Net простые массивы типа T[,,..] независимо от от размерности - все нативные.
.Net оболочка этих массивов просто предоставляет доступ к нативному коду этих массивов.
Etyuhibosecyu, вот исходники метода создания массива:
C#
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
namespace System
{
    public abstract unsafe partial class Array
    {
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Interop.LibraryImportGenerator", "42.42.42.42")]
        private static unsafe partial void InternalCreate(global::System.Runtime.CompilerServices.QCallTypeHandle type, int rank, int* pLengths, int* pLowerBounds, bool fromArrayType, global::System.Runtime.CompilerServices.ObjectHandleOnStack retArray)
        {
            int __fromArrayType_native;
            // Marshal - Convert managed data to native data.
            __fromArrayType_native = (int)(fromArrayType ? 1 : 0);
            {
                __PInvoke(type, rank, pLengths, pLowerBounds, __fromArrayType_native, retArray);
            }
 
            // Local P/Invoke
            [global::System.Runtime.InteropServices.DllImportAttribute("QCall", EntryPoint = "Array_CreateInstance", ExactSpelling = true)]
            static extern unsafe void __PInvoke(global::System.Runtime.CompilerServices.QCallTypeHandle __type_native, int __rank_native, int* __pLengths_native, int* __pLowerBounds_native, int __fromArrayType_native, global::System.Runtime.CompilerServices.ObjectHandleOnStack __retArray_native);
        }
    }
}
Это из Framework. В Core аналогично, но не стал искать ссылку сейчас на них.
Массив создаётся нативной функцией, которая экспортируется в 65-66 строках.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.10.2025, 08:25

Заменить элементы одной коллекции на элементы другой коллекции
Всем привет, у меня такой вопрос: есть 2 коллекции: List<Person> list1 = new List<Person>...

Сделать сортировку коллекции вместо создания новой коллекции с передачей IOrderedEnumerable<T>
Есть: SortableObservableCollection&lt;T&gt; using System; using System.Collections.Generic; using...

Анонимные коллекции в другие коллекции, как?
Здравствуйте. Говорю сразу, я не уверен что есть такой термин как анонимная коллекция. Наверно...

Дано число R и коллекцию размера N. Преобразовать коллекцию, заменив все ее положительные элементы на число R
Всем доброго времени суток. Вот такая задачка. Дано число R и коллекция размера N....

При замене одной переменной в коллекции на другую меняются сразу две коллекции
Есть две коллекции public readonly List&lt;Cable&gt; Cables = new List&lt;Cable&gt;() { ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Хабру пора сливаться, время пришло, оно прийдёт за всеми, но ему давно пора (Хабр - галимый плагиат и кликбейт с саморекламой).
Hrethgir 04.08.2026
Стирают публикации с эффективными алгоритмами (в частности по алгоритму обхода дерева, был опубликован там 3-го мая, в зипапке . . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru