5 августа 2011 г.

Как инвертировать строку

Пусть нам дана строка "abcd". Нас просят её инвертировать, т.е. вывести буквы в обратном порядке. Это сделать весьма просто и не нужно писать свой собственный метод. Воспользуемся методом расширения Reverse() и ToArray() из LINQ to Objects.
static void Main(string[] args)
{
var rev = "abcd".Reverse().ToArray();
Console.WriteLine(rev);
Console.ReadKey();
}
Первый метод возвращает итератор символов IEnumerable<char>, который проходит по ним в обратном порядке. Второй метод создаёт на основе этого итератора массив типа char.

P.S. этот вопрос очень часто любят задавать на собеседованиях =)

Перехват всех исключений на сайте ASP.NET

Перехват всех исключений на сайте ASP.NET происходит в обработчике события Application_Error. Его вы можете найти в файле global.asax. Пример такого метода:

void Application_Error(object sender, EventArgs e)
{
Logger logger = LogManager.GetCurrentClassLogger();
Exception ex = Server.GetLastError();
while (ex.InnerException != null)
ex = ex.InnerException;
Response.Write("Ошибка");
logger.Error("{0} on {1}: {2}", ex.GetType(), ((HttpApplication)sender).Context.Request.Url, ex.Message);
Server.ClearError();
}

Здесь создаётся объект для логирования ошибки (библиотека NLog). Затем получаем объект последнего исключения при помощи метода Server.GetLastError(). Затем в цикле доходим до самого нижнего исключения, чтобы получить наиболее подробную информацию. Потом отправляем в браузер пользователя сообщение о том, что произошла ошибка, при этом саму ошибку ему не показываем. Делаем запись в лог и удаляем последнее исключение.

Оператор using и освобождение ресурсов

Занимаясь написанием управляемого кода на .NET разработчик может не заботиться об освобождении уже использованных ресурсов. За него это делает сборщик мусора. Но что делать, если объект пользуется неуправляемыми ресурсами (изображения, соединение с БД)?

Любой управляемый объект, которые содержит в себе ссылки на неуправляемые  ресурсы, должен реализовывать интерфейс IDisposable, который предоставляет метод Dispose(). Этот метод позволяет освободить используемые объектом неуправляемые ресурсы.

Примером такого объекта является экземпляр класса Bitmap. Воспользуемся следующей конструкцией для работы с подобным объектом:

using (Bitmap PictureBitmap = new Bitmap("c:\\test.jpg"))
{
   // здесь выполняем все нужные нам операции с данными объектом
}

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

Bitmap PictureBitmap = null;
try
{
   PictureBitmap = new Bitmap("c:\\test.jpg");
   // здесь выполняем все нужные нам операции с данными объектом
}
finally
{
  if(PictureBitmap != null)
  {
      PictureBitmap.Dispose();
  }
}

По понятным причинам, лучше не использовать using внутри другой конструкции try - catch - finally.