Feel Good.

17 июня 2010

Блок using и null object

Интересное поведение наблюдается, если в блоке using используется нулевой объект: using(null){...}. Казалось бы, очевидно, у нас должно возникнуть исключение NullReferenceException при попытке вызвать метод Dispose нулевого объекта (null object), как только мы выйдем за пределы блока using:

using ((IDisposable)null)

{

}

// Исключения NullReferenceException не будет.

// Метод Dispose вызван не будет.


03 июня 2010

Enum как результат

Иногда, бывает очень удобно возвращать результат работы сервис-метода в качестве Enum значения. Представим ситуацию: Вы пишите сервис-метод, который возвращает два возможных состояния true/false (область значений), как бы Вы поступили, ограничились бы стандартным типом Bool или все-таки ввели бы новый Enum? Идея оставить Bool не совсем удачна, если вдруг придется расширить область значений сервис-метода. Например, в задаче аутентификации пользователя, где помимо информации об удаче/неудаче необходимо указать, в чем состоит неудача аутентификации, в итоге получим 4 возможных результата: "успех" (Ok), "провал" (Fail), "логин не верен" (LoginIncorrect), "пароль не верен" (PasswordIncorrect):

// Результат аутентификации

enum LoginStatus

{

    // Успех

    Ok = 0,

    // Провал

    Fail = (2 << 1),

    // Уточняем, в чем провал:

    LoginIncorrect = (2 << 2),

    PasswordIncorrect = (2 << 3)

}