→ Sample
Такое случается, что при разработке приложения прокрадываются баги, а некоторые из них так же являются утечками памяти (Memory Leaks). Особенно такое явление бывает распространено, когда ваше приложение работает с документами или с сессиями, которые можно открывать и закрывать. Вам нужно убедиться, что при закрытии все, что было создано именно для этого документа, будет удалено из памяти, а так же все ресурсы будут освобождены. Особенно неприятно, когда вы нашли такой баг с утечкой памяти, исправили его, а после очередного обновления кода – он опять проявился.
Однажды, после одного из исправлений утечки памяти – у меня всплыла мысль, неужели нет каких-нибудь инструментов, которые просто могут валидировать, что после закрытия все мои объекты удалены, что после очередного моего изменения кода я не вызову новых утечек памяти? В native мире, на самом деле, таких инструментов предостаточно (но, к сожалению, я не могу вам их назвать, так как не являюсь экспертом в этой области), в managed тоже полно, но они требуют запускать инструменты параллельно. Такие инструменты обычно имеют слова Memory Profiler в названии, а запускать их нужно параллельно с вашим приложением, чтобы проверять на утечки памяти, да еще их результат нужно постоянно анализивароть. Мне же захотелось использовать что-то в коде, какой-то инструмент, который я бы мог отключать, и который будет присутствовать на всем этапе разработки, обладающий возможностью мгновенно отреагировать на утечку памяти в моем коде. Решение, на самом деле, оказалось совсем простым. Я попробовал, основываясь на Weak Reference (слабые связи) классах создавать коллекцию объектов, за которыми мне нужно следить, и которые должны быть удалены из памяти в определенный момент. Основываясь на этом принципе, я создал очень простой Object Release Verification Framework с несколькими классами и интерфейсами. Данный инструмент я опубликовал на nuget.org, как portable library.
Итак, давайте рассмотрим на примере.
IDN (Internationalized domain name) – это имена доменов, которые могут быть представлены в виде имени, содержащем не только латинские буквы, но и буквы других национальных алфавитов, вроде русского, арабского, китайского и т.п. (на данный момент поддерживается не так много). Представлены – это ключевое слово, так как на самом деле хранятся и передаются они в виде Punycode строк. Например, у нашей любимой почты России есть сайт http://почтароссии.рф, а Punycode представление этого сайта http://xn--80aqavbdjjaf8c.xn--p1ai/. Это важно понимать, если вы будете в запросах своего приложения (используя WebRequest, например) писать хост как IDN представление, то это имя хоста не будет распознано (если у вас не какой-нибудь специальный DNS сервер), нужно заранее переводить его в Punycode строку.
Любому приложению нужно что-то сообщать пользователю, например, об удачном или неудачном окончании операции, о неожидаемой ошибке в приложении. Реализовать такие информативные области можно по-разному. Есть старый, проверенный, способ с MessageBox. Эти диалоговые окошки с нами уже очень давно, они переходят из технологии в технологию, и в Silverlight есть такой класс MessageBox.
Есть и другой способ отображать сообщения, который я считаю немного дороже по реализации, но который в несколько раз более приятный для глаз пользователя – это отображение этого сообщения не как модального окна, а как некоторой области прикрепленной сверху или снизу. Один из примеров: нотификация в браузерах о том, что страница пытается получить информацию о вашем местоположении. Правильная комбинация обоих способов, конечно же, дает самый лучший и приятный вариант для пользователя, ведь иногда нам все-таки нужно остановить пользователя, чтобы спросить его о чем-то, и тут приходит на помощь первый вариант. Сегодня я хотел бы более подробно обсудить первый вариант на примере Silverlight, так как именно там стандартный MessageBox уж очень скудный.
Как часто у меня бывает такое, что в одной руке у меня кружка чая или пряник, а другой рукой я печатаю и вожу мышкой. И вот не могу я одной рукой сразу же нажать Ctrl+C или Ctrl+V (могу конечно, но не удобно, не привычно). Во всех программах, на всех сайтах, у меня есть возможность выделить мышкой текст и скопировать его, а дальше вставить в другое место, а вот TextBox по умолчанию в Silverlight не предоставляет мне такой возможности, и это очень плохо. В особенности для бизнес-приложений. Люди привыкают к стандартным функциям, нельзя их лишать этого. Я говорю об этом меню:

В Silverlight 4 появилась возможность обрабатывать нажатие правой кнопки мыши, и так же с ним появился контрол ContextMenu (в Silverlight Toolkit). Следовательно, мы теперь можем обогатить наш интерфейс.
Первое, с чего можно начать, это погуглить и найти что-то вроде такой статьи Silverlight 4 textbox right click context menu with cut, copy and paste behavior, которая приведет нас к более доработанному варианту TextBoxCutCopyPasteBehavior. Его, как показала практика, мне тоже пришлось немного доработать.
На прошлой неделе я, просто ради интереса, подготовил 4 примера в Еще одно сравнение паттернов MVVM и MVP для Silverlight. Примеры возникли не случайно, просто, попался на эту проблему пару недель назад. Там же был опросник о том, какие из примеров рабочие. Определить просил просто, посмотрев на код. Было получено 56 (вместе с моим) ответов, и только два из них были верными (вместе с моим). В этих примерах я уточнил, что опрос касается Silverlight, так как в WPF все немного по-другому.