powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как эта проблема решается в C#?
22 сообщений из 22, страница 1 из 1
А как эта проблема решается в C#?
    #38245287
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245295
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, и не стыдно?

IDisposable + оператор using
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245299
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245350
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. просто отдать на откуп сборщику мусора мешает только беспокойство, что когда он там ещё этот мусор уберёт, а using - это "здесь и сейчас"?

Ну, стыдно, конечно. Но меня удивило, что вот так просто человек может написать "stream.close() - это вам не хухры-мухры", и толпа специалистов будет писать простынми кода, спорить и всё равно придут к не очень удобному решению, которое, судя по всему, утилизирует целый специальный элемент синтаксиса для решения одной единственной задачи (выбрасывания исключений в некотором исключительном случае). И доступно это будет только с версии 7 (т. е. относительно недавно для такого уже немолодого языка).
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245366
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Т. е. просто отдать на откуп сборщику мусора мешает только беспокойство, что когда он там ещё этот мусор уберёт, а using - это "здесь и сейчас"?
Дело в освобождении внешних ресурсов, которые находятся вне досягаемости CLR. Открытый файл означает, что ОС держит некий набор данных и именно мы его должно освобождать как можно раньше. Именно для этого, а не для освобождения памяти, нужна связка using/IDisposable.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245393
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем тогда нужен метод Close у класса Stream, если даже в МСДНе вместо него фактически советуют использовать Dispose (и using, соответственно)?
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245398
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

и еще именно для неуправляемых ресурсов Finalize, а точнее IDispose pattern. в MSDN отлично написан.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245413
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, потому что если мы открыли файл (поток), то мы должны иметь возможность закрыть его. Также название Close() больше подходит по смыслу чем Dispose(). В подобных классах Close() и Dispose() делают одно и тоже.

Совет из MSDN правильный. Обрати внимание, что это совет, а не требование. У нас есть выбор между явным вызовом Close() и его же неявным вызовом при использовании using() { ... }. У варианта с using есть еще полезный эффект. Переменная внутри него видна только в блоке using.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245428
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

кстати Dispose/Close на самом-то деле не освобождают неуправляемые ресурсы. Это так, чтобы не было недопонимания. В любом случае все осовобождение будет через GCC
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245432
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan, finalize это последняя возможность освободить внешний ресурс, если Dispose() не был вызван. В подобном случае Finalize() и IDisposable будут работать в паре. Если вызван Dispose(), то Finalize() уже не нужен (GC.SuppressFinalize()). Не говоря уже о том, что сработавший Finalize() продлит время жизни объекта на одно поколение.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245434
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

именно поэтому я и дал ссылку на правильную реализацию. Которая работает именно так как вы описали!
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245459
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanкстати Dispose/Close на самом-то деле не освобождают неуправляемые ресурсы.
Не говори глупостей. Взгляни на этот класс и расскажи мне как Dispose() не освобождает здесь неуправляемый ресурс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
public sealed class CustomBuffer : IDisposable
{
	private IntPtr _buf = IntPtr.Zero;

	private const int HEAP_ZERO_MEMORY = 0x00000008;

	[DllImport("kernel32.dll", SetLastError=true)]
	private static extern IntPtr GetProcessHeap();

	[DllImport("kernel32.dll", SetLastError=false)]
	private static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, UIntPtr dwBytes);

	[DllImport("kernel32.dll", SetLastError=true)]
	static extern bool HeapFree(IntPtr hHeap, uint dwFlags, IntPtr lpMem);

	public CustomBuffer(int size)
	{
		if (size > 0 && size < 0x7FFF8)
		{
			_buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, new UIntPtr((uint)size));
		}
	}

	~CustomBuffer()
	{
		Dispose(false);
	}

	public void Dispose()
	{
		Dispose(true);
	}

	private void Dispose(bool disposing)
	{
		if (_buf != IntPtr.Zero)
		{
			HeapFree(GetProcessHeap(), 0, _buf);
			_buf = IntPtr.Zero;
		}

		if (disposing)
		{
			GC.SuppressFinalize(this);
		}
	}
}

...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245470
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

да, я неправильно выразился. Хотел донести мысль, что для управляемых всякие =null лишь помогают быстрее их "удалить". В данном случае да все дескрипторы закрываются.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245474
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanкстати Dispose/Close на самом-то деле не освобождают неуправляемые ресурсы. Это так, чтобы не было недопонимания. В любом случае все осовобождение будет через GCC
Коллектор не занимается чисткой unmanaged ресурсов. Садись, двойка. RTFM.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245475
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, оно даже понятно из названия: неуправляемый ресурс
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245503
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

тебя уже выпустили?? либо ты не понял о чем я, либо прикидываешься. Вообщем ТС дали инфу для размышления. Осталось прочитать статейку http://msdn.microsoft.com/ru-ru/library/b1yfkh5e(v=vs.100).aspx и тд
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245553
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
[DllImport("kernel32.dll", SetLastError=true)]
private static extern IntPtr GetProcessHeap();

[DllImport("kernel32.dll", SetLastError=false)]
private static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, UIntPtr dwBytes);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool HeapFree(IntPtr hHeap, uint dwFlags, IntPtr lpMem);


Хе-хе, оказывается, Дотнет зачастую - просто обёртка над обычным виндовым АПИ. А я думал, у него всё низкоуровнево с нуля написано.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245558
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

обертка с нуля написана :)
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245565
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Хе-хе, оказывается, Дотнет зачастую - просто обёртка над обычным виндовым АПИ.
А операционная система всего лищь обертка над BIOS-ом. Нет чтобы с нуля всё написать, да?
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245575
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал, я спокоен...
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245617
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileА операционная система всего лищь обертка над BIOS-ом.
а БИОС всего лишь надстройка над теми сигналами , которыми оперирует материнская плата....
А Материнская плата оперирует электрическими сигналами
А Электрические сигналы это электроны...
А электроны это кварки, бозоны....

Т.е. Любая программа , на самом деле ,это управление кварками. гы.
...
Рейтинг: 0 / 0
А как эта проблема решается в C#?
    #38245762
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320автор
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
[DllImport("kernel32.dll", SetLastError=true)]
private static extern IntPtr GetProcessHeap();

[DllImport("kernel32.dll", SetLastError=false)]
private static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, UIntPtr dwBytes);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool HeapFree(IntPtr hHeap, uint dwFlags, IntPtr lpMem);


Хе-хе, оказывается, Дотнет зачастую - просто обёртка над обычным виндовым АПИ. А я думал, у него всё низкоуровнево с нуля написано.Почитайте хотябы ВикипкдиЮ.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как эта проблема решается в C#?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]