Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
На заметку! Интерфейс
IDisposable
ref
Finalize()
Dispose()
ref
В целях иллюстрации применения интерфейса
IDisposable
SimpleDispose
MyResourceWrapper
System.Object.Finalize()
IDisposable
using System;
namespace SimpleDispose
{
// Реализация интерфейса IDisposable.
class MyResourceWrapper : <b>IDisposable</b>
{
// После окончания работы с объектом пользователь
.
// объекта должен вызывать этот метод
public void Dispose()
{
// Очистить неуправляемые ресурсы...
.
// Освободить другие освобождаемые объекты, содержащиеся внутри.
// Только для целей тестирования
Console.WriteLine("***** In Dispose! *****");
}
}
}
Обратите внимание, что метод
Dispose()
Dispose()
Finalize()
Dispose()
IDisposable
Dispose()
Dispose()
using System;
using System.IO;
using SimpleDispose;
Console.WriteLine("***** Fun with Dispose *****n");
// Создать освобождаемый объект и вызвать метод Dispose()
.
// для освобождения любых внутренних ресурсов
MyResourceWrapper rw = new MyResourceWrapper();
rw.Dispose();
Console.ReadLine();
Конечно, перед попыткой вызова метода
Dispose()
IDisposable
IDisposable
is
as
Console.WriteLine("***** Fun with Dispose *****n");
MyResourceWrapper rw = new MyResourceWrapper();
if (rw is IDisposable)
{
rw.Dispose();
}
Console.ReadLine();
Приведенный пример раскрывает очередное правило, касающееся управления памятью.
Правило. Неплохо вызывать метод
Dispose()
IDisposable
Dispose()
Dispose()
С предыдущим правилом связано одно предостережение. Несколько типов в библиотеках базовых классов, которые реализуют интерфейс
IDisposable
Dispose()
System.IO.FileStream
IDisposable
Dispose()
Close()
// Предполагается, что было импортировано пространство имен System.IO
static void DisposeFileStream()
{
FileStream fs = new FileStream("myFile.txt", FileMode.OpenOrCreate);
// Мягко выражаясь, сбивает с толку!
// Вызовы этих методов делают одно и то же!
fs.Close();
fs.Dispose();
}
В то время как "закрытие" (close) файла выглядит более естественным, чем его "освобождение" (dispose), подобное дублирование методов очистки может запутывать. При работе с типами, предлагающими псевдонимы, просто помните о том, что если тип реализует интерфейс
IDisposable
Dispose()