Когда нужно использовать nullable типы в c#?

Меня неоднократно задавали следующие вопросы во многих интервью.... Но все еще не может объяснить их с простым примером...

  1. Что такое nullable типы в c#?
  2. Когда нужно использовать nullable типы в c#?
  3. Можно ли дать простой пример?

Какие-либо предложения?

35
задан Kazelin 16 April 2015 в 00:08
поделиться

9 ответов

Из Использование типов, допускающих значение NULL (Руководство по программированию на C #) (Ссылка обновлена ​​ около 2018 г. )

Для Например, когда вы можете использовать тип , допускающий значение NULL, рассмотрим, как обычная логическая переменная может иметь два значения : true и false. Не существует значения , означающего "неопределенное". Во многих приложениях программирования, в большинстве особенно взаимодействий с базой данных, переменные могут находиться в неопределенном состоянии. Например, поле в базе данных может содержать значения "истина" или ложь, но также может вообще не содержать значения . Точно так же ссылочные типы могут иметь значение null, чтобы указать , что они не инициализированы.

34
ответ дан 27 November 2019 в 06:50
поделиться

Рассмотрим следующий пример:

Инструмент имеет настройки, указанные через пользовательский интерфейс. Однако инструмент также можно запустить из командной строки, а параметры, указанные в пользовательском интерфейсе, можно переопределить с помощью командной строки. Таким образом, код выглядит следующим образом:

bool? setting1;

... Обрабатывать командную строку, если указан параметр do:

setting1.Value = setting;

... позже

if(setting1.HasValue)
  ui.setting1 = setting1.Value
9
ответ дан 27 November 2019 в 06:50
поделиться

Как мы все знаем, в 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;
}
4
ответ дан 27 November 2019 в 06:50
поделиться
// to replace   
// if(foo.Id > 0)
if(foo.Id.HasValue)
{
    Update(foo);
}
else
{
    Insert(foo);
}
1
ответ дан 27 November 2019 в 06:50
поделиться

Null означает «нет значения» или «нет данных». Вы используете типы, допускающие значение NULL, когда "без значения" является допустимым значением в контексте любой системы, которую вы планируете / используете.

int? weightOfCargo = TryGetTruckCargoWeight()

В этом случае тип, допускающий значение NULL, указывает, что TryGetTruckCargoWeight () может возвращать значение NULL. Обычно это означает, что данные недоступны (может быть, грузовика нет, может, он не был взвешен и т. Д.).

20
ответ дан 27 November 2019 в 06:50
поделиться

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

С уважением.

1
ответ дан 27 November 2019 в 06:50
поделиться

Еще один пример:

представьте, вам нужно создать метод GetArticles в вашем BLL. Этот метод должен принимать такие аргументы, как период даты (аргументы от и до ), строка поиска (аргумент search ) и категория документа ( categoryId аргумент). Все эти аргументы необязательны. Таким образом, в одном случае вы хотите определить только из аргумента и search , а в другом - только аргумент categoryId .

Для этого вы можете создать множество перегрузок для метода GetArticles с необходимой комбинацией аргументов. Другой способ - определить единственный метод GetArticles (DateTime? From, DateTime? To, строковый поиск, int? CategoryId) для этого. В этом случае, если аргумент null , он будет пропущен.

Конечно, я знаю о новой функции в .NET 4.0 , называемой необязательными параметрами и именованными аргументами , но до этого для меня это был хороший обходной путь.

3
ответ дан 27 November 2019 в 06:50
поделиться

В C # есть два типа данных. Тип значения и ссылочные типы. String - это ссылочный тип, а int - это тип значения. Типу ссылки может быть присвоено значение NULL, например string s = null; . Но вы не можете присвоить нулевое значение непосредственно целому числу. Подобно int a = null // Итак, чтобы тип значения принимал нулевое значение, используются типы, допускающие значение NULL. Чтобы сделать его обнуляемым, ? добавлен в

? a = null;//ok.
2
ответ дан 27 November 2019 в 06:50
поделиться

Всякий раз, когда вы используете назначенные значения для представления нулевого значения:
* минимальное значение DateTime для представления нулевого значения
* -1 для представления неустановленного значения для целое число
, то лучшим выбором будет тип, допускающий значение NULL.

4
ответ дан 27 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: