Архив категорий: Обучающий материал

Форматирование даты и времени в C#

Доброго времени суток! Эта статья является продолжением той, в которой я рассказывал как можно получить текущее время в программе, написанной на C#… Статья будет содержать справочную информацию. А если конкретнее, то я расскажу о форматировании даты/времени при выводе (а точнее, преобразовании в строку). Сначала я приведу примеры стандартных вариантов форматирования (эти варианты могут закрыть большинство Ваших потребностей), а во второй части, я коснусь пользовательских (кастомных) вариантов форматирования (дающих большее свободы программисту).

Оптимизация пузырьковой сортировки. Реализация на C#.

Сортировка пузырьком

Доброго времени суток! В этой статье я расскажу о простой оптимизации алгоритма пузырьковой сортировки (bubble sort), пример простейшей реализации которого я приводил в предыдущей статье (рекомендую прочесть, чтобы понять суть данной стать). Идея данной оптимизации заключается в сокращении избыточных итераций, т. е. поочередных переборов элементов исходного массива. Работать (давать положительный результат) данная модификация алгоритма будет только в том случае, когда избыточные итерации действительно присутствуют (например, попался почти отсортированный массив). Ниже, приведен результат выполнения программы из предыдущей статьи, с массивом, который практически отсортирован. В консоль выводится массив до сортировки, и после каждого перебора его элементов (и видные перестановки его элементов, выполненные во время каждой из итераций).

Пузырьковая сортировка. Реализация на C#.

Сортировка пузырьком

Доброго времени суток! В этой статье я расскажу об алгоритме сортировки массивов, достаточно простом и не самом эффективном (причем, далеко не самом), но тем не менее, для изучения базовых алгоритмов (в данном случае сортировки), разобрать его будет весьма полезно для начинающих программистов. Сортировка, реализованная по данному алгоритму, называется «пузырьковая сортировка» (bubble sort).

И так, пузырьковая сортировка относится к так называемым сортировкам обменами. Основная идея заключается в последовательных, и многократных переборах всех элементов массива, с сравнением смежных элементов (первый со вторым, второй с третьим, третий с четвертым и т.д.). При этом, если сравниваемые (смежные) элементы массива не отсортированы относительно друг друга, то они меняются местами.

Таким образом, если мы, например, сортируем массив целых чисел по возрастанию, по после первого же перебора всех элементов, самый большой элемент окажется в конце массива. После второго перебора, второй по величине элемент станет предпоследним, и т.д.

«Пустые» значения в C#

Доброго времени суток! В этой статье я расскажу об использовании так называемых «пустых» или «неопределенных» значений для различных сущностей наших программ, написанных на C#. «Пустое» (или «неопределенное») значение задается какой-либо переменной тогда, когда программисту неизвестно, какое значение должна принимать эта переменная на данном шаге выполнения программы, а установка любого другого («конкретного») значения недопустимо.

Например, наша программа получает из «внешнего мира» (базы данных, по сети, или от пользователя с клавиатуры, или еще каким-то образом) некое значение, и есть два сценария развития событий:

  • первый, это когда значение получено (например, пользователь ввел значение);
  • второй, когда значение не получено (пользователь отказался вводить значение, и перешел к следующему шагу).

Освобождение ресурсов в C# (Часть 2. IDisposable)

Доброго времени суток! В этой статье я продолжу рассказывать об освобождении неуправляемых ресурсов внутри объектов, в программах, написанных на C#. В предыдущей статье, я рассказывал о том, как можно выполнить эту задачу используя финализаторы, а так же, перечислил негативные стороны применения данного подхода. В этой статье, я расскажу о ещё одной возможности для освобождения ресурсов — о реализации интерфейса IDisposable.

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

Освобождение ресурсов в C# (Часть 1. Финализаторы)

Доброго времени суток! В этой, и ряде следующих статей, я хочу поговорить об освобождении неуправляемых ресурсов, используемых  в объектах классов, написанных на C#. О чем вообще пойдет речь, ведь в C# объекты удаляются сами (точнее, так называемым сборщиком мусора), т.е. программисту не нужно освобождать память из-под каждого созданного оператором new объекта, как это было в C++. Да, это так, но C# программистам всё ещё приходится работать с так называемыми, неуправляемыми ресурсами, например, файлами, или подключениями к базам данных.

Представьте пример, когда мы пишем некий «класс-обертку» над механизмом работы с файлами. Объекты такого класса будут открывать файлы (скорее всего в своих конструкторах), писать/читать информацию в них, ну и в конце концов должны «закрывать» эти файлы. В C++ такие задачи решались без особых трудностей, там были деструкторы.

Анонимные методы и лямбда-выражения в C#

Анонимные методы и лямбда-выражения

Доброго времени суток! В этой статье я расскажу об использовании анонимных методов и лямбда-выражений в связке с делегатами. Если Вы не читали две предыдущий статьи и совсем не знакомы с понятием делегата в C#, то рекомендую их (знакомство с делегатами (Часть 1 и Часть 2)) к прочтению. Для остальных, приведу пример объявления вот такого вот типа делегатов:

//Пример делегата
delegate double DoubleOperation(double anAgr);

Знакомство с делегатами в C# (Часть 2)

Делегаты в C# (практика)

Доброго времени суток! В этой статье, я покажу как на практике можно использовать делегаты, и как с их помощью добиваться, в некотором смысле, универсальности (или абстракции) поведения для объектов своих классов. Эта статья является продолжением предыдущей, так что рекомендую её почитать, если Вы совсем не знакомы с делегатами в C#. И так, давайте вспомним что такое делегат… По сути, это объект, который хранит ссылку на некий метод, и может этот метод вызвать при необходимости. Точнее мы можем вызвать метод через этот объект. И особенность использования делегатов в том, что при объявлении ссылки на объект-делегат мы можем и не знать, на какой конкретно метод, будет ссылаться этот объект. Мы только знаем, что целевой метод должен иметь определенного вида список параметров и тип возвращаемого значения. А вот уже эту особенность можно использовать на своё благо! А как это сделать, я сейчас покажу на примере.

Знакомство с делегатами в C# (Часть 1)

Делегаты в C# (теория)

Доброго времени суток! В этой статье я хочу рассказать о том, что такое делегаты в C#, как их создавать и как ими пользоваться. Делегат — это сущность в программе, которая хранит ссылку на какой-либо метод, и при необходимости, может этот метод вызвать. Сразу же может возникнуть вопрос, а зачем вызывать метод через какого-то посредника, если можно вызвать его напрямую? Дело в том, что на этапе сборки программы, программист может не знать какой метод нужно будет вызвать в определенный момент выполнения программы. А использование делегатов, как раз позволяет написать, в какой-то степени, абстрактный код. Но об этом я расскажу в следующей статье, в которой покажу пример использования делегатов на практике. А пока просто поверьте мне на слово.

Ну давайте уже разберемся как создаются делегаты. Для создания делегата, нужно сначала определить его тип. Как и в случае классов, мы создаем некий шаблон, в соответствии с которым, буде в дальнейшем создавать конкретные экземпляры. Тип делегата определяется по следующему правилу:

C#. Стратегия использования блоков catch

Использование нескольких блоков catch

В этой статье я вновь хочу коснуться темы обработки исключительных ситуаций, в программах, написанных на C#. Точнее, я хочу рассказать о нескольких нюансах, связанных с обработкой ошибок, а именно, с использованием блоков catch (блоков обработки ошибок). Как мы помним, основная идея подхода к обработке исключительных ситуаций, заключается в разделении программного кода на две части, одна представляет собой потенциально опасный блок кода (в ней могут происходить ошибки), а другая отвечает за обработку произошедших ошибок. Схематично это может выглядеть так: