Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480

Для чего IL компилятору требуется using очистки памяти под объявленный и создаваемый неуправляемый ресурс?

23.08.2021, 23:12. Показов 4178. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для очистки памяти под неуправляемый ресурс рекомендуется using, который IL компилятор разворачивает в код, в котором есть в том числе Dispose и finally.
Зачем вообще указывается using для объявленного и создаваемого неуправляемого ресурса?
Почему IL компилятор, увидев объявленный и создаваемый неуправляемый ресурс (имхо, чаще всего делается и объявление), не может делать то же, что делает, встретив using?
А using оставить только для случая, если ресурс объявлен где-то вне фигурных скобок, если это надо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2021, 23:12
Ответы с готовыми решениями:

Функция для очистки памяти, выделенную под массив структур
Как правильно очистить память в данном случае? Есть структура struct a { char *a1;//выделял память под строку char *a2; ...

Создание *.dll: для чего нужен компилятору параметр -DBUILD_DLL? (использую MinGW)
Не, реально, зачем он? ...Друзья! Много где в инете вы найдёте как кропать dll-ки, например тут. обратите внимание на командную...

Программы для очистки файла подкачки, гибернации, оперативной памяти
Программы для очистки файла подкачки, гибернации, оперативной памяти. Собственно вопрос есть программы которые при запуски очищали бы эти...

28
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18373 / 14304 / 5370
Регистрация: 17.03.2014
Сообщений: 28,990
Записей в блоге: 1
24.08.2021, 01:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fylhtq05 Посмотреть сообщение
Это для компилятора тоже простая задача.
Сколько компиляторов вы уже написали?
2
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
24.08.2021, 02:17  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Сколько компиляторов вы уже написали?
1237. А что не так? Вы считаете сложным проверку на return и на проверку наличия IDisposable. Это же делает человек, когда пишет using. Значит и компилятор может это сделать, только быстрее, т.к. алгоритм простой.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
24.08.2021, 09:41
Fylhtq05, не только return надо проверять. обьект можно передать в параметре функции.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.08.2021, 09:53
Лучший ответ Сообщение было отмечено nicolas2008 как решение

Решение

Цитата Сообщение от Fylhtq05 Посмотреть сообщение
алгоритм простой.
Если потратить больше 5 секунд на его обдумывание, то он станет не таким простым.

C#
1
2
var disposable = new Disposable();
someObject.DoSomething(disposable);
Откуда компилятору в примере выше знать, что будет делаться со ссылкой в методе DoSomething?

C#
1
2
var disposable = new Disposable();
disposable.Foo();
Откуда компилятору в примере выше знать, что будет делаться с this в методе Foo?

C#
1
var disposable = new Disposable();
Откуда компилятору в примере выше знать, что будет делаться с this в конструкторе?

Получается единственный случай, когда компилятор может самостоятельно что-то сделать - это когда переменная объявляется, но ей не присваивается никакое значение. В этом случае он и так уже переменную удаляет.
2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18373 / 14304 / 5370
Регистрация: 17.03.2014
Сообщений: 28,990
Записей в блоге: 1
24.08.2021, 10:50
Цитата Сообщение от Fylhtq05 Посмотреть сообщение
Вы считаете сложным проверку на return и на проверку наличия IDisposable.
Я считаю это ненужным усложнением. Тем более что дело не ограничивается только прямым return-ом. Значение можно обернуть в другой объект
C#
1
2
3
4
5
StreamReader Foo()
{
    var fstream = new FileStream("file", FileMode.Open, FileAccess.Read);
    return new StreamReader(fstream);
}
можно записать в out параметр
C#
1
2
3
4
5
void Foo(out Stream stream)
{
    var fstream = new FileStream("file", FileMode.Open, FileAccess.Read);
    stream = fstream;
}
или в поле/свойство класса
C#
1
2
3
4
5
6
Stream stream;
void Foo()
{
    var fstream = new FileStream("file", FileMode.Open, FileAccess.Read);
    stream = fstream;
}
Цитата Сообщение от Fylhtq05 Посмотреть сообщение
алгоритм простой.
Не такой уж и простой, но главное не в этом. В итоге мы получим ограниченный и спорный выигрыш. Не стоит оно того.
1
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
24.08.2021, 10:53
Fylhtq05, можно натаскать компилятор на простейшие случаи но в таком случае это приведет к большой путанице.
Сейчас контроль на разработчике а так каждый будет думать а покрывает та или иная реализация такой вот умное освобождение ресурсов или нет что в итоге приведет что как и раньше все будут использовать явный using))
1
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
27.08.2021, 13:31  [ТС]
Цитата Сообщение от FateOri Посмотреть сообщение
а так каждый будет думать а покрывает та или иная реализация такой вот умное освобождение ресурсов или нет
Можно написать, что вот в таком простейшем случае и только в нем using можно не использовать. В остальных требуется using. Мне кажется, что самый простейший случай и является самым распространенным.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18373 / 14304 / 5370
Регистрация: 17.03.2014
Сообщений: 28,990
Записей в блоге: 1
27.08.2021, 14:05
Fylhtq05, если считаете это полезным нововведением, то создайте дискуссию в репозитории языка - https://github.com/dotnet/csha... Discussion. Изложите аргументы, возможно к вам прислушаются.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
27.08.2021, 14:35
Цитата Сообщение от Fylhtq05 Посмотреть сообщение
Почему IL компилятор, увидев объявленный и создаваемый неуправляемый ресурс (имхо, чаще всего делается и объявление), не может делать то же, что делает, встретив using?
В общем случае, такая логика была бы очень сложна.
И я думаю, всё равно однозначно верной её работы во всех возможных случаях не удалось бы добиться.

Добавлено через 2 минуты
Возможно, допустим, когда используется не сам объект - на него будет только локальная переменная.
А его метод или дочерний вложенный объект, или метод дочернего объекта.
Но если к ним обратиться после Dispose, то результат будет некорректен или выпадет исключение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2021, 14:35

От чего зависит размер памяти, выделяемой под объект
Правильны ли ответы? Размер памяти, выделяемой под объект Object Pascal зависит от: а) количества и типов полей класса и классов...

Освободить память из под bitmapа (неуправляемый код)
Режу bitmap на куски примерно таким кодом private static unsafe Bitmap CopyRegion( BitmapData sourceData, Rectangle region )...

Объясните int** a = new int* [n]; смысл этой строки. Это выделение памяти под чего?
#include <iostream> #include <locale.h> using namespace std; int main() { setlocale(LC_ALL, "russian"); int n, tmp; ...

Для чего требуется setlocal enabledelayedexpansion ?
Объясните русским языком, зачем нужен setlocal enabledelayedexpansion ?

Ошибка очистки динамической памяти
Добрый день! Пожалуйста подскажите? что я делаю не так? Записываю небольшой текст в RichEdit, считываю его в динамический массив,...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru