Net framework 5, а также среды Visual Studio 2012 и C#


типы, использующие системные ресурсы



Download 6,27 Mb.
Pdf ko'rish
bet429/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   425   426   427   428   429   430   431   432   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C

типы, использующие системные ресурсы
Итак, теперь вы знаете, как определить производный от 
SafeHandle
класс, 
инкапсулирующий системный ресурс. Давайте посмотрим, как разработчики 
используют подобные типы. Начнем с более распространенного класса 
System.
IO.FileStream
. Класс 
FileStream
позволяет открыть файл, прочитать из него 


584
Глава.21 .Автоматическое.управление.памятью.(уборка.мусора)
и записать в него байты, а затем закрыть его. При создании объекта 
FileStream
вызывается Win32-функция 
CreateFile
, возвращаемый дескриптор сохраняется 
в объекте 
SafeFileHandle
, а ссылка на этот объект сохраняется как закрытое 
поле в объекте 
FileStream
. Класс 
FileStream
также поддерживает ряд допол-
нительных свойств (например, 
Length

Position

CanRead
) и методов (
Read

Write

Flush
).
Допустим, нам требуется код, который создает временный файл, записывает 
в него байты, после чего удаляет файл. Для начала рассмотрим такой вариант:
using System;
using System.IO;
public static class Program {
public static void Main() {
// Создание байтов для записи во временный файл
Byte[] bytesToWrite = new Byte[] { 1, 2, 3, 4, 5 };
// Создание временного файла
FileStream fs = new FileStream("Temp.dat", FileMode.Create);
// Запись байтов во временный файл
fs.Write(bytesToWrite, 0, bytesToWrite.Length);
// Удаление временного файла
File.Delete("Temp.dat"); // Генерируется исключение IOException
}
}
К сожалению, если скомпоновать и запустить этот код, работать он, скорее всего, 
не будет. Дело в том, что вызов статического метода 
Delete
объекта 
File
заставляет 
Windows удалить открытый файл, поэтому метод 
Delete
генерирует исключение 
System.IO.IOException
с таким сообщением (процесс не может обратиться к файлу 
Temp dat
, потому что он используется другим процессом):
The process cannot access the file "Temp.dat" because it is being used by 
another process
Однако в некоторых случаях файл все же удаляется! Если другой поток иници-
ировал уборку мусора между вызовами методов 
Write
и 
Delete
, поле 
SafeFileHandle
объекта 
FileStream
вызывает свой метод финализации, который закрывает файл 
и разрешает выполняться методу 
Delete
. Однако вероятность данной ситуации 
крайне мала, поэтому в 99 случаях из 100 приведенный код работать не будет.
Классы, позволяющие пользователю управлять жизненным циклом инкапсу-
лированных системных ресурсов, реализуют интерфейс 
IDisposable
, который 
выглядит так:
public interface IDisposable {
void Dispose(); 
}



Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   425   426   427   428   429   430   431   432   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish