Меня неоднократно задавали следующие вопросы во многих интервью.... Но все еще не может объяснить их с простым примером...
Какие-либо предложения?
Из Использование типов, допускающих значение NULL (Руководство по программированию на C #) (Ссылка обновлена около 2018 г. )
Для Например, когда вы можете использовать тип , допускающий значение NULL, рассмотрим, как обычная логическая переменная может иметь два значения : true и false. Не существует значения , означающего "неопределенное". Во многих приложениях программирования, в большинстве особенно взаимодействий с базой данных, переменные могут находиться в неопределенном состоянии. Например, поле в базе данных может содержать значения "истина" или ложь, но также может вообще не содержать значения . Точно так же ссылочные типы могут иметь значение null, чтобы указать , что они не инициализированы.
Рассмотрим следующий пример:
Инструмент имеет настройки, указанные через пользовательский интерфейс. Однако инструмент также можно запустить из командной строки, а параметры, указанные в пользовательском интерфейсе, можно переопределить с помощью командной строки. Таким образом, код выглядит следующим образом:
bool? setting1;
... Обрабатывать командную строку, если указан параметр do:
setting1.Value = setting;
... позже
if(setting1.HasValue)
ui.setting1 = setting1.Value
Как мы все знаем, в C# есть два различных типа
-Refrence type
-Значение
Ссылочный тип может быть представлен как несуществующее значение (NULL), а тип Vaue, однако, не может представлять значение NULL.
Например,
Поскольку String является ссылочным типом, вы можете объявить его как null
String s=null; //ok
Но если вы попытаетесь объявить тип значения, такой как Int32, как null, это приведет к ошибке компилятора
Int32 i=null; // compiler error
Чтобы представить null в типе значения, вы должны использовать специальную конструкцию, называемую nullable type. Она представлена с помощью символа ?
Int32? I=null; //now its ok
Сценарий, в котором обычно используются nullable типы, - это программирование баз данных, где calss отображается на таблицу с nullable столбцами.
- Если столбцы являются ссылочным типом, то есть String, например (адрес электронной почты и адрес клиента), то проблемы нет, так как вы можете определить их как null в C#
.
- Но если столбцы имеют тип значения double, например (баланс счета клиента), вы не сможете отобразить их в C# без использования nullable типов.
Например
// отображается на таблицу Customer в базе данных
public class Customer
{
...
public decimal? AccountBalance;
}
// to replace
// if(foo.Id > 0)
if(foo.Id.HasValue)
{
Update(foo);
}
else
{
Insert(foo);
}
Null означает «нет значения» или «нет данных». Вы используете типы, допускающие значение NULL, когда "без значения" является допустимым значением в контексте любой системы, которую вы планируете / используете.
int? weightOfCargo = TryGetTruckCargoWeight()
В этом случае тип, допускающий значение NULL, указывает, что TryGetTruckCargoWeight () может возвращать значение NULL. Обычно это означает, что данные недоступны (может быть, грузовика нет, может, он не был взвешен и т. Д.).
Я думаю, если мы будем говорить о реальном сценарии, когда ваша таблица базы данных содержит в ней столбцы, допускающие значение NULL, и вам нужно создать DTO (объекты передачи данных) как отображение сущностей базы данных. В таких сценариях вам нужно получить точно такое же сопоставление типов данных в ваших классах сущностей. Чтобы достичь такого требования, типы, допускающие значение NULL, действительно очень полезны для создания точно такого же сопоставления и позволяют пользователю легко работать в этом сенарио.
С уважением.
Еще один пример:
представьте, вам нужно создать метод GetArticles
в вашем BLL. Этот метод должен принимать такие аргументы, как период даты (аргументы от
и до
), строка поиска (аргумент search
) и категория документа ( categoryId
аргумент). Все эти аргументы необязательны. Таким образом, в одном случае вы хотите определить только из аргумента
и search
, а в другом - только аргумент categoryId
.
Для этого вы можете создать множество перегрузок для метода GetArticles
с необходимой комбинацией аргументов. Другой способ - определить единственный метод GetArticles (DateTime? From, DateTime? To, строковый поиск, int? CategoryId)
для этого. В этом случае, если аргумент null
, он будет пропущен.
Конечно, я знаю о новой функции в .NET 4.0
, называемой необязательными параметрами и именованными аргументами , но до этого для меня это был хороший обходной путь.
В C # есть два типа данных. Тип значения и ссылочные типы. String - это ссылочный тип, а int - это тип значения. Типу ссылки может быть присвоено значение NULL, например string s = null;
. Но вы не можете присвоить нулевое значение непосредственно целому числу. Подобно int a = null //
Итак, чтобы тип значения принимал нулевое значение, используются типы, допускающие значение NULL. Чтобы сделать его обнуляемым, ?
добавлен в
? a = null;//ok.
Всякий раз, когда вы используете назначенные значения для представления нулевого значения:
* минимальное значение DateTime для представления нулевого значения
* -1 для представления неустановленного значения для целое число
, то лучшим выбором будет тип, допускающий значение NULL.