Tw-city.info

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Программирование консольных приложений

Программирование консольных приложений

На этом шаге мы рассмотрим понятие консольного приложения и приведем пример такого приложения.

Консольное приложение — это программа, которая для взаимодействия с пользователем использует консоль — клавиатуру и монитор, работающий в режиме отображения символьной информации (буквы, цифры и специальные знаки).

В операционной системе консольное приложение работает в окне командной строки (рисунок 1), которое часто называют окном консоли.

Рис.1. Консольное приложение

Консольные приложения удобны для решения задач, в которых не предъявляется особых требований к интерфейсу. Они широко используются для решения системных задач. Следует обратить внимание, что многие утилиты Microsoft .NET Framework реализованы как консольные приложения.

Консольное приложение может вывести информацию на экран и получить данные с клавиатуры одним из трех способов:

  • при помощи функций printf (вывод) и scanf (ввод);
  • вывести информацию в поток вывода(cout), прочитать данные из потока ввода(cin);
  • при помощи методов WriteLine и ReadLine объекта Console.

Основным способом взаимодействия с пользователем в консольных .NET-приложениях, созданных Microsoft Visual Studio, является использование объекта Console. Методы, обеспечивающие отображение и ввод данных, перечислены в таблице 1.

Метод Console::Write выводит на экран (в окно консоли) строку, указанную в качестве параметра метода.

Если надо вывести значение числовой переменной, то для преобразования числа в строку следует использовать метод ToString. Вид (формат) строки, возвращаемой методом ToString, определяет параметр, указанный в инструкции вызова метода (таблица 2).

Следует обратить внимание, что символ-разделитель целой и дробной частей числа задает операционная система. Этот же символ надо использовать и при вводе дробных чисел.

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

Метод WriteLine отличается от метода Write тем, что после вывода строки курсор автоматически переходит в начало следующей строки.

Параметр метода WriteLine можно не указывать. В этом случае курсор будет переведен в начало следующей строки.

Метод ReadLine объекта Console обеспечивает ввод с клавиатуры строки символов. Для преобразования введенной строки в данные необходимо использовать соответствующие методы преобразования: System::ToInt16() , System::ToInt32() , System::ToSingle() , System::ToDouble() и т. д.

Следует обратить внимание на то, что в процессе преобразования строки в число возможны ошибки (исключения), например, из-за того, что при вводе дробного числа пользователь введет точку вместо запятой («правильным» символом, при стандартной для России настройке операционной системы, является запятая).

В качестве примера использования методов объекта Console приведем программу пересчета цены из долларов в рубли.

Результат работы приложения приведен на рисунке 2.

Рис.2. Результат работы приложения

На следующем шаге мы рассмотрим создание консольного приложения.

Консольные приложения и параметры программы

Цель лекции

Освоить работу с консольными приложениями и с параметрами программы.

Консольные приложения

На сегодняшний день о программировании на Lazarus существует очень мало книг на русском языке, и все они описывают работу в основном, с консольными приложениями, хотя особой надобности в консолях сейчас нет. Но и совсем обойти эту тему нельзя. Что же такое консольное приложение ?

Консольным приложением называется программа , которая не имеет графического интерфейса — окон, и которая работает в текстовом режиме в черно-белой консоли. Команды в такой программе приходиться вводить с клавиатуры, результаты работы консольные приложения также выводят на экран в текстовом режиме.

Если вы пользуетесь операционной системой Windows , то нажмите на «Пуск» и выберите команду «Выполнить«. В открывшемся окне наберите

и нажмите . Откроется командная консоль , в которой команды нужно вводить в текстовом режиме:

Собственно, вы видите окно предка Windows — операционной системы MS-DOS . Именно так выглядел экран с загруженной ОС MS-DOS , и управлять ею приходилось, вручную набивая всевозможные команды. Это уже позже корпорация Microsoft навесила на ядро MS-DOS всевозможные драйверы и утилиты, снабдила его графическим оконным интерфейсом, и появилась сначала полуграфическая ОС Windows 3.10 (русский вариант был 3.11 версии), а затем и целиком графическая Windows 95 . Но к консольному ядру системы можно обращаться и в современных ОС, в Windows для этого используется программа cmd.exe, а в ОС Linux — терминал .

Все языки высокого уровня позволяют делать и консольные приложения, другое дело — зачем? Подавляющее большинство современных программ имеет графический интерфейс , который мы с вами создавали с самой первой лекции. А консольные приложения делаются в основном, системными программистами. Несмотря на то, что Object Pascal обладает для этого всеми необходимыми инструментами, системщики обычно пользуются такими языками, как Ассемблер , C, реже — C++. Но все же знать, как создаются консольные приложения нужно, поэтому данную лекцию мы посвящаем им.

Создание консольного приложения

Создать консольное приложение можно разными способами, но проще всего так. Откройте Lazarus. Командой «Проект -> Закрыть проект» закройте текущий проект, автоматически появится окно Мастера создания проекта. В нем нажмем кнопку «Новый проект«. Появится окно создания проекта, в котором можно выбрать «Программа» или «Консольное приложение«. Если мы выберем «Программа«, то будет создан модуль с минимальным кодом. Если же мы выберем «Консольное приложение«, то кода будет больше, так как при этом создается программа с новым классом, производным от TCustomApplication . TCustomApplication обеспечивает хорошую основу и делает программирование утилит командной строки довольно простым. Например, проверку опций командной строки, написание справки, проверку переменных окружения и обработку исключений. Все программы LCL автоматически это используют.

Но нам не нужно использовать возможности класса TCustomApplication , мы делаем простую консольную программу, поэтому в окне создания проекта мы выбираем «Программа«. Сформируется проект, а в Редакторе исходного кода будет минимум текста:

Обратите внимание, если нам нужно подключить к программе какие то модули, то делать это нужно до комментария

В этом случае мы ставим запятую после указанного модуля Classes и добавляем свои модули. Завершающая точка с запятой стоит после комментария, нам её ставить не нужно.

Свой код мы будем писать между скобками

А если нам потребуется указать глобальные константы , переменные или сделать объявления процедур и функций, то все это делается до begin .

Для примера мы создадим простое приложение , а по ходу дела, познакомимся с инструментами ввода-вывода информации в консольных приложениях.

WRITE и WRITELN

Процедура Write предназначена для вывода информации на экран. Она имеет следующий синтаксис :

Действует процедура следующим образом. В скобках мы можем указать какой-то текст, вывести содержимое переменных. Например:

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

Процедура Writeln действует точно также, но после вывода последнего символа курсор переходит на начало следующей строки.

Для ознакомления с процедурами создайте новый проект «Программа«. Модуль можно не переименовывать, просто сохраните его в папку 21-01. Полный текст модуля следующий:

Обратите внимание: раздел переменных var мы указали до служебного слова begin , то есть, переменные a и b в пределах модуля являются глобальными. Далее мы присвоили переменным значения, затем вывели на экран приветствие, а потом содержимое переменных. На процедуру readln() пока не обращайте внимания, она нужна только, чтобы программа не закрылась сразу же после вывода текста, а была на экране, пока мы не нажмем . Сохраните проект и запустите его на выполнение. И сразу же мы видим недостаток: вместо русских букв выходит нечто, что в Интернете называют «кракозябры»:

В «Символы и строки» мы упоминали, что в консольных приложениях Windows принято использовать кодировку CP866, тогда как в графических приложениях используется CP1251 и Юникод. Отсюда и «кракозябры». В Linux и Unix таких проблем нет. Однако решить эту проблему совсем несложно. Нажмите , чтобы закрыть консоль , и вернитесь в Редактор кода. Щелкните по окну с кодом правой кнопкой мыши, и в открывшемся контекстном меню выберите команду «Параметры файла -> Кодировка -> CP866«. Откроется окно смены кодировки, нам надо нажать кнопку «Изменить файл«. Снова запустите программу на выполнение — теперь с кодировкой полный порядок :

Windows для новичка: что такое консольные приложения

Каждый второй опытный пользователь, услышав от новичка фразу «А что такое консольная программа?», начинает скрежетать зубами. Поэтому если вы — новичок, то лучше прочитать эту статью, чтобы не напороться на этого второго из двух опытных, а если вы уже опытный пользователь, то имеет смысл подсунуть заметку новичку, чтобы тот нашёл ответ на свой вопрос.

Итак, что же скрывается за этим страшным словосочетанием — консольное приложение? Приложение, как вы знаете, это в мире Windows не то, что к чему-то прикладывается, а компьютерная программа. Word, Excel, пасьянс «Косынка» и Internet Explorer — это всё приложения. Приложения бывают разными. Не только в том смысле, что Word отличается от «Блокнота», но и по принципу организации своего пользовательского интерфейса. Интерфейс — это внешний вид программы, и в Windows он бывает двух типов. Первый — это графический, второй — текстовый. Графический интерфейс система подсовывает вам под нос ежедневно. Все программы, имеющие красивые разноцветные окна, имеют и графический интерфейс. Даже Word и «Блокнот», хоть и работают с текстом, но интерфейс имеют графический. Где же тогда в наши дни можно увидеть программу, работающую в режиме текстового интерфейса?

Для того, чтобы увидеть текстовый пользовательский интерфейс (его ещё называют интерфейсом командной строки — прочитав этот абзац до конца, вы узнаете, почему), не нужно делать каких-то особенно сложных действий. Нажмите кнопку «Пуск», выберите пункт «Выполнить», наберите в строке появившегося окна текст «command» и нажмите кнопку «Выполнить». Вы увидите перед собой окно с серым текстом на чёрном фоне — примерно такое же, как изображено на иллюстрации к статье. Это — командная строка, одна из самых старых вещей в современном персональном компьютере.

Дело в том, что ещё не так давно, около двадцати лет назад, мощности компьютеров, стоящих у пользователей дома и на работе, не хватало на отображение даже такой несложной графики, как окна (что и говорить о трёхмерных видеоиграх!). Поэтому компьютеру и пользователям приходилось общаться с помощью текста. Пользователь вводил специальные команды — например, команда dir в первой из систем производства Microsoft, DOS, позволяла просмотреть список файлов и папок в определённой директории, а команда ver показывала версию операционной системы, с которой работал пользователь. Программы, которые запускал пользователь, тоже, естественно, работали в текстовом режиме.

Командная строка, как вы видите, сохранилась в Windows до сих пор. Команды, которые можно выполнить из неё, подробно описаны в справке Windows. А приложения, которые выполняются в текстовом режиме, теперь называются консольными.

Почему же командная строка продолжает жить, несмотря на свой почтенный возраст? Во-первых, есть множество программ, которым не нужен графический интерфейс — например, программы по взлому паролей, которые просто подбирают комбинации символов, пока то, что закрыто паролем, не откроется. Кроме того, командная строка приходит на помощь тем пользователям, которые выучили назубок её команды и быстро набирают с клавиатуры, — для них она гораздо более быстрый способ работать с компьютером, чем графический интерфейс.

Консольных программ масса, и они используются часто для того, чтобы упростить рутинные действия пользователя. Дело в том, что с ними можно обращаться точно так же, как и с обычными командами. А те, в свою очередь, можно записать в специальный текстовый файл с расширением BAT или CMD (такой файл называется командным), и их можно потом выполнить все залпом как обычную программу — достаточно в «Проводнике» дважды кликнуть по этому файлу мышью.

Консольное приложение на ассемблере

После разработки серии оконных приложений, мы познакомились с основными принципами программирования графических примитивов. И тут дернула меня нечистая написать простую программку для решения специфической микрозадачи. Понятное дело, что использовать оконный интерфейс для подобного случая не очень то и хотелось, поэтому было решено сделать приложение консольным .. лучше бы я в этот огород вообще не лез! 🙂 Ну уж, как говорится «взялся за гуж, не говори что не дюж».
Было бы бессмысленно отрицать, что в последние десятилетия роль графического интерфейса существенно возросла, тем не менее в новейших операционных системах текстовые режимы всё еще сохраняются в виде разнообразных графических подсистем, в частности — текстового пользовательского интерфейса (окна командной строки/терминала). Из этого следует, что если уж текстовый режим до сей поры присутствует в операционных системах, значит он не является исключительно аппаратным рудиментом, поддержка которого существует лишь на уровне видеоадаптера, а представляет собой актуальный и активно используемый механизм. Основная причина по которой текстовый режим всё еще существует, заключается в следующем:

Дело в том, что большинство упомянутых системных утилит мигрировали к нам из ранних версий операционной системы Windows, куда они, в свою очередь, заимствовались как из той же MSDOS (фактически предка Windows), так и из сторонних операционных систем. Соответственно, в старых ОС, до определенного времени, интерфейс взаимодействия с пользователем (командная строка) ограничивался текстовым режимом, по этой причине и разрабатывались утилиты исключительно под него. Казалось бы, при переходе операционных систем к графическому режиму, стоило бы переписывать и системные утилиты под новые реалии? Тем не менее это не имело ни малейшего смысла, поскольку системные утилиты представляют собой обособленную группу программ, предназначенных для работы в командных сценариях, своеобразных программах, которые используют простые языки описания действий, в которых вывод одной программы может поступать на вход другой, то есть вся работа зачастую ведется без необходимости визуального оповещения пользователя. Очевидно, что использование графического интерфейса тут явно не к месту (избыточно). Описанная выше так называемая «преемственность» консольных утилит имеет под собой ряд весомых причин:

  • возможность (для взаимодействия) использовать стандартные потоки ввода-вывода (будут описаны ниже).
  • наличие потоков позволяет использовать консольные утилиты в сценариях (скриптах), где выходные потоки одних утилит могут перенаправляться во входные потоки других.
  • оптимизация приложения по скорости выполнения и потреблению системных ресурсов.
  • удобство программирования, обусловленное простотой и небольшим набором функций обслуживания консоли.

Помимо класса консольных утилит, в практике разработчика часто возникают задачи, в которых разворачивать оконный графический интерфейс соразмерно напрасной трате своего и процессорного времени. В подобного рода задачах вполне достаточным условием является использование текстового (для вывода диагностических сообщений) или вовсе неинтерактивного (вывод данных в файл) режимов. Действительно, зачем пытаться изображать графический интерфейс там, где он явно излишен или вовсе не обязателен, не проще ли в таких задачах от него отказаться вовсе? Поэтому, сегодня мы акцентируем внимание на особенностях языка Ассемблера (FASM) при написании консольного приложения на ассемблере под Windows, и темой данной статьи будет создание серии простейших консольных приложений, демонстрирующих основные алгоритмы взаимодействия с консолью. Разработанные шаблоны (в примерах) могут быть в дальнейшем использованы в качестве базовых в различного рода проектах.
Итак, в словосочетании консольное приложение на ассемблере присутствует ключевое слово «консоль», на которое стоит обратить особое внимание, поскольку именно оно даст нам понимание основных принципов работы. Скорее всего, люди уже знакомые с компьютером в общем и операционными системами в частности, знают что это такое, хотя могут понимать это в широком, так сказать, смысле этого слова: механизм для ввода информации с клавиатуры и вывода ее на экран. Поэтому, не лишним будет дать серию расширенных определений:

что является базой для:

что, в свою очередь, формирует понятие:

Консольное приложение операционной системы Windows обеспечивает взаимодействие с пользователем через так называемое окно консоли . Примером подобных консольных приложений могут являться: окно командной строки (cmd), файловые менеджеры (например, Far Commander), и ряд типовых системных консольных утилит:

Различия оконного и консольного приложений

Консольные приложения являются одним из типов исполняемых образов (приложений) Windows, наряду с типовыми оконными (GUI), библиотеками (DLL), драйверами (native) и некоторыми другими. По сути это полноценные приложениями, имеющие ряд специфических отличий:

  • Значение поля Subsystem заголовка результирующего PE-файла равно 3 ( IMAGE_SUBSYSTEM_WINDOWS_CUI ). На основании значения данного поля, загрузчик образов при подготовке приложения к выполнению производит свойственную консольным приложениям последовательность загрузки.
  • При запуске консольного приложения, загрузчик образов пытается наследовать консоль от процесса-родителя (приложение, из-под которого был произведен запуск):
    • Создается новая консоль, если родительский процесс не имеет консоли.
    • Консоль наследуется, если процесс-родитель тоже является консольным приложением (окно командной строки и прочее).
  • Консоль создается/наследуется с тремя стандартными потоками (объектами) ввода/вывода, каждый из которых имеет свой описатель (для организации программного обмена).
  • [визуально] На основе параметров в ветви реестра HKEY_CURRENT_USERConsole , на рабочем столе создается/открывается отдельное окно с текстовым режимом отображения содержимого;
  • [визуально] При запуске из проводника ( explorer.exe ), операционная система открывает окно консольного приложения, производит выполнение кода консольного приложения и затем закрывает окно консоли. То есть, если не предпринято дополнительных мер, окно консольного приложения очень быстро «промелькивает» на экране.
  • Имеется возможность создания приложения, которое функционально ограничено единственной библиотекой kernel32.dll (использование функции работы с консолью и сохранение совместимости между версиями Windows). Это позволяет отказаться от подключения библиотеки user32.dll (функции работы с окнами), что, в свою очередь, предотвращает загрузку серии зависимых библиотек на этапе подготовки образа к выполнению, тем самым обеспечивается создание более оптимизированных по использованию памяти приложений.

Следует ли из всего вышеперечисленного, что все функциональные методы консольного приложения «заключены» внутри собственного текстового консольного окна и им лишь и ограничиваются? Отнюдь, основная идея заключается в том, что отличие оконного приложения от консольного чисто условное, поскольку консольное приложение сохраняет возможность вызывать GUI-функции (то есть функции, работающие уже с графическими примитивами) программного интерфейса Win32, все зависит лишь от набора подключаемых библиотек. Поэтому можно сделать следующее обобщение:

Иначе говоря, консольные приложения имеют возможность полноценно взаимодействовать с функциями Win32 API наравне с типовым оконным GUI-приложением, ведь в процессе написания исходного кода автор имеет возможность импортировать (подключать) любые функции любых доступных коду библиотек, каковые он сочтет нужными.

Объекты консольного приложения

Выводить текст на консоль, осуществлять ввод символов в консоль, а так же совершать иные действия с консолью можно лишь ассоциировав с ней некие системные сущности (объекты), через которые можно обеспечивать обмен информацией. Каждая консоль состоит из следующих основных объектов:

  • [единственный] входной буфер — область данных (события/сигналы/данные) для ввода (передачи на консоль);
  • [несколько] экранный выходной буфер — область данных (символы/атрибуты) для вывода (отображения на экране);
  • Окно консоли — область экрана, отображающая часть выходного буфера;
  • Текущая позиция курсора — маркера вывода, обозначающий текущую позицию вывода;

Стандартные потоки

С консолью в операционной системе Windows закреплено три основных потока ввода-вывода:

Основы программирования. Консольное приложение

Шаг 11. Базы данных и первое консольное приложение

Почему первое приложение и только на 11-м шаге? На самом деле первым приложением можно было бы назвать и пример с сортировкой, рассмотренный на самом первом шаге, но я уверен, что реальных пользователей для него найти сложно. Программы, рассматриваемые сейчас, предоставляют пользователю возможность не только выполнять SQL запросы, но и редактировать данные в базе данных, что уже само по себе является завершенным набором предлагаемых пользователю действий. Таким образом, если устранить все минусы реализации, о которых будет сказано чуть ниже, у подобных программ, помимо их автора, потенциально могут быть и другие пользователи. Более совершенный, но также не лишенный ряда недостатков вариант этого же приложения будет представлен на следующем шаге – тот же набор функций будет доступен пользователю посредством графического пользовательского интерфейса.

Описание задачи

Кратко перечислю, какие функции и в каком режиме будут предоставляться пользователю рассматриваемых ниже программ:

Работа с базой данных в режиме транзакции. Транзакция позволяет рассматривать работу нескольких изменяющих данные SQL запросов, как одну целостную операцию, результат работы которой можно либо сохранить в базе данных либо целиком отменить – откатить транзакцию. Если вы не знакомы с инструкциями SQL, изменяющими информацию в базе данных, то предлагаю узнать про них здесь.

Общение программы с пользователем посредством неграфического интерфейса – консоли. Результаты SELECT запросов, а также количество записей, обработанных UPDATE, DELETE и INSERT командами будут выводиться на консоль. Также, на консоль будет выводиться информация об ошибках и возможных дальнейших действиях пользователя – т.е. все, как и раньше.

Описание реализации

После запуска, программа сразу же осуществляет соединение с базой данных Data.mdb , которая должна находиться в том же каталоге, что и сама программа. Как и в случае предыдущих шагов, предлагается использовать базу данных компьютерного курса SQL 25™. Если соединение с базой данных осуществить по какой-то причине не удастся, то на консоль будет выведено сообщение о причинах такой неудачи, и программа завершится. Если соединение прошло удачно, то запускается цикл while , на каждой итерации которого пользователю предлагается ввести запрос и получить информацию о результатах его работы. В случае если в ходе ввода SQL запроса была допущена синтаксическая или семантическая ошибка, то сообщение об этом также будет выведено на консоль. В конце каждой итерации (после обработки очередного запроса) пользователь может либо продолжить работу с программой, нажав ‘Enter’, либо закончить работу, нажав любую другую кнопку. В последнем случае логическая переменная Continue , являющаяся условием продолжения работы цикла while принимает значение false и цикл while завершается. Далее, если в процессе работы был выполнен хотя бы один модифицирующий данные SQL запрос, то пользователю будет предложено сохранить эти изменения в базе данных или выйти из программы без сохранения изменений. О наличии изменений, которые могли бы быть сохранены в базе данных, программа узнает по значению логической переменной DataChanged , которое определяется в теле основного цикла. Ну и в конце работы соединение с базой данных закрывается. Обратите внимание, что делается это в теле блока finally, который гарантирует выполнение этого кода, как в случае ошибок, так и в случае корректного завершения программы. Более подробно про исключительные ситуации и блок finally можно узнать здесь. Стоит отметить, что результат работы команды SELECT учитывает изменения, внесенные командами UPDATE, DELETE и INSERT в контексте текущей транзакции, в чем можно будет убедиться, запустив программу и выполнив пару запросов.

Детали реализации

Для работы с базой данных создан отдельный класс DataManager . Впервые про классы в рамках этого курса программирования упоминалось на шаге “Пять классов математики”, где я попытался кратко изложить преимущества объектно-ориентированного программирования. Здесь я использовал отдельный класс для того, чтобы отделить детали реализации работы с базой данных от логики самой программы. Если, например, понадобится реализовать работу с любой другой СУБД (не Microsoft Access), то достаточно будет внести изменения только в код класса DataManager . Можно, конечно, развить идею и дальше, определив абстрактный класс работы с любой базой данных и реализовав производные от него классы для каждой конкретной СУБД, но уже не в рамках этого шага.

Класс DataManager реализует два разных метода для обработки SQL запросов: метод Select() для выполнения SELECT запросов и метод Execute() для выполнения запросов, направленных на редактирование данных посредством команд UPDATE, DELETE и INSERT. Какой из этих двух методов выполнять определяется по первому ключевому слову введенного пользователем SQL запроса. В случае если первым словом во введенном SQL ( SQL.StartsWith ) является SELECT, то вызывается метод Select() , во всех других случаях вызывается метод Execute() . Во втором варианте также изменяется значение переменной DataChanged , о которой упоминалось выше.

Алгоритм программы, включая определение класса DataManager , достаточно объемный, и нет никакого смысла публиковать какую-то его отдельную часть здесь. Для более детального изучения работы программы необходимо скачать ее исходный код на C# или VB.NET и открыть в обучающей программе.

Исходный код программ

Тестовый набор данных

Файл базы данных Microsoft Access Data.rar (Data.mdb).

Самостоятельно

Буквально пару слов о минусах реализации, которые предлагается, если такое желание появится, устранить самостоятельно:

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

В ходе рассмотрения нюансов работы с базой данных, на предыдущих этапах делался акцент на том, что работа с экземплярами таких классов, как DbCommand и DbReader необходимо осуществлять в контексте оператора using, который гарантирует корректное освобождение занимаемых ими ресурсов операционной системы. Замечу, что если этого не делать, то ресурсы все равно будут освобождены, но только тогда, когда об этом позаботится сборщик мусора среды исполнения CLR. Оператор using хорош в тех случаях, когда использование подобных объектов представлено только одним отдельным фрагментом кода. Во всех других случаях можно использовать явный вызов метода Dispose() интерфейса IDisposable ровно в тот момент, когда необходимость в объекте исчезает. Как это делается описано здесь.

Читать еще:  C al программирование
Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector