?

Log in

No account? Create an account

hitfounder


Путь программиста

Рассуждаю о культуре программирования


Previous Entry Share Next Entry
Nullable типы в C#
hitfounder
Полезных фишек, облегчающих жизнь, в C# предостаточно. С удивлением для себя обнаружил еще одну очень полезную особенность: "Nullable типы" - типы, включающие весь диапазон значений базового типа + null. В С++ часто возникает необходимость помимо численно результата вычислений возвращать еще и результат выполнения самой функции, т.е. удачно ли прошла операция, валидно ли вычисленное значение. Хорошо, если заранее известно, что результат вычисления не может быть равен нулю или не может быть отрицательным, тогда ошибку будут сигнализировать именно запрещенные значения результата. Однако когда результат покрывает все значения типа, приходится вводить дополнительные параметры к функции, специально сигнализирующие об ошибке. В C# эту проблему решают Nullable типы.

Обозначается nullable тип очень легко: после названия регулярного типа ставится "?", по сути этим знаком к диапазону значений базового типа прибавляется null. Вот так можно использовать nullable int для функции преобразования строки в число:

public static int? ToNullableInt32(string s)
{
   int i;
   if (Int32.TryParse(s, out i))  {
      return i;
   }
   return null;
}
Tags:


  • 1
Вообще, возвращаемый результат не должен содержать в себе информации об ошибке (кроме, специальных методов, таких, как IsValid, TryParse, ContainsKey и т.п.). Для ошибок нормальные люди используют эксепшены.

Nullable типы изначально задумывались как средство, упрощающее работу с БД, где все типы могу не содержать значений (т.е. быть null)

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

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

Эксепшены придумали не просто так, а как решение проблемы некорректного поведения кода, когда методы возвращали errnumber.

Вообще, я воспринимаю nullable, как то, что может не иметь значения, а не то что может хранить ошибку

Re: возвращаемый результат не должен содержать в себе и

> кроме, специальных методов, таких, как IsValid, TryParse, ContainsKey и т.п.

Можно ещё добавить, что если ошибка всего одна в принципе, то можно вернуть и null для сигнализации о ней, а в остальных случаях - значение.

С невозмбуждающими исключеня методами иногда заметно легче работать... ;-)

  • 1