Практики кодирования для типа C # Nullable

Я никогда не использовал типы, допускающие значение NULL, в своем коде C#. Теперь я решил изменить свою практику кодирования, введя в свой код типы, допускающие значение NULL.

Какие основные изменения в методах кодирования следует внести при переходе от обычных типов данных к типам данных, допускающим значение NULL, в случае прикладного программирования?

О каких областях стоит позаботиться?

На какие моменты я всегда должен обращать внимание?


person user366312    schedule 11.10.2009    source источник


Ответы (6)


Nullable<T> полезен, когда вам нужно возможное недопустимое состояние для типа значения. или если данные извлекаются из базы данных, которая может содержать значение null для столбца. Очень часто в каком-то старом коде FORTRAN, который я переношу на C#, недопустимые значения должны быть отрицательными или равными 0, но это проблематично, особенно когда значения используются в математических функциях. Гораздо более явно использовать Nullable<T>, чтобы показать это возможное недопустимое состояние.

Стоит отметить, что следующее то же самое:

Nullable<int> myNullableInt;
int? myNullableInt;
person user7116    schedule 11.10.2009
comment
Советы. Не забывайте, что нулевое значение из базы данных представлено ADO.NET как DBNull.Value. Обязательно используйте DBNull.Value для связи с БД вместо null в Nullable‹T›. - person Ferry Meidianto; 11.10.2009

Не используйте типы, допускающие значение NULL, потому что это «крутая новинка», которую вы открыли. Используйте их там, где они применимы и действительно полезны.

При их использовании возникают накладные расходы, и при неправильном использовании они излишне усложняют ваш код.

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

person Jason Williams    schedule 11.10.2009
comment
Это никогда не бывает хорошей идеей. Потому что никто не знает, какие изменения грядут в .net framework, и может быть, что эти изменения полностью основаны на типах Nullable. - person user366312; 11.10.2009
comment
@JMSA: я не понимаю, что ты пытаешься сказать. - person Jason Williams; 11.10.2009
comment
+1. Типы, допускающие значение NULL, невероятно полезны, когда они вам нужны, но Джейсон прав в том, что он не обременяет вызывающих абонентов необходимостью постоянно проверять значения на соответствие null. Рассмотрите возможность создания исключения, если значение null недопустимо. - person TrueWill; 11.10.2009

Кроме того, я считаю полезным следующее свойство:

public bool? IsHappy { get; set; }

Это позволяет мне иметь логическое значение с тремя состояниями: да, нет, не ответил.

person youwhut    schedule 25.02.2011

Пара других хороших идей по использованию типов, допускающих значение NULL:

  • Не забывайте о гибкости синтаксиса. Nullable<int> совпадает с int?
  • Проверьте значение null (var.HasValue) и приведите его к базовому типу, прежде чем использовать его в качестве базового типа.
person LJM    schedule 11.10.2009
comment
'приведите его к базовому типу, прежде чем использовать его в качестве базового типа.' - Я не понимаю, что вы здесь имеете в виду... Если вам нужно значение, просто используйте 'var.Value' или даже 'var', если вы уже проверили, что оно имеет значение. - person nicodemus13; 28.03.2012
comment
О, я понимаю, что вы имеете в виду здесь; вы имеете в виду, когда присваиваете его новой переменной базового типа? - person nicodemus13; 28.03.2012
comment
да. т.е. всегда проверяйте, чтобы убедиться, что ваш Nullable‹int› имеет значение, прежде чем помещать это значение в int. - person LJM; 29.03.2012

Они кажутся подходящими для начального значения некоторых переменных типа значения.

int? lastCodeReceived;

if (lastCodeReceived.HasValue)
{
    // At least one code has been received.
}
person xyz    schedule 11.10.2009

Я редко использую типы, допускающие значение NULL. Единственное место, где я их использую, это когда я имею дело с нулевыми типами в базе данных.

person Chuck Conway    schedule 11.10.2009