Когда следует использовать обнуляемые типы в C #? - PullRequest
33 голосов
/ 13 апреля 2010

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

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

Есть предложения?

Ответы [ 9 ]

33 голосов
/ 13 апреля 2010

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

Например, когда вы можете использовать обнуляемый тип, рассмотрим, как обычная логическая переменная может иметь два значения: true и false. Здесь нет значение, которое означает «неопределенный». В многие программные приложения, большинство особенно взаимодействия с базой данных, переменные могут существовать в неопределенном государство. Например, поле в база данных может содержать значения true или ложь, но она также может не содержать значение на всех. Аналогично, ссылка типы могут быть установлены в нуль, чтобы указать что они не инициализированы.

19 голосов
/ 13 апреля 2010

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

int? weightOfCargo = TryGetTruckCargoWeight()

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

9 голосов
/ 13 апреля 2010

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

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

bool? setting1;

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

setting1.Value = setting;

... позже

if(setting1.HasValue)
  ui.setting1 = setting1.Value
4 голосов
/ 13 апреля 2010

КАК мы все знаем, что в C #

есть два разных типа

• Тип ссылки
• Тип значения
Тип ссылки может быть представлен как несуществующее значение (NULL), но тип Vaue, однако не может представлять значение NULL.
Например,

Поскольку String является ссылочным типом, вы можете объявить его как null

 String s=null;  //ok

Но если вы попытаетесь объявить тип значения, например Int32, нулевым, это приведет к ошибке компиляции

Int32 i=null;    // compiler error

Чтобы представить значение null в типе значения, вы должны использовать специальную конструкцию, называемую типом, допускающим значение NULL. Это представлено с помощью? символ.

Int32? I=null; //now its ok

Теперь сценарий, когда обычные типы, допускающие обнуляемость, используется в программировании базы данных, где calss отображается в таблицу с обнуляемыми столбцами.
• Если столбцы относятся к ссылочному типу типа String, например (адрес электронной почты и адрес клиента), проблема не возникает, так как вы можете определить его как нулевой в C #
• Но если столбцы имеют тип значения, который является двойным, например (остаток на счете клиента), вы не можете сопоставить его с C # без использования обнуляемых типов.
Например,
// сопоставляется с таблицей Customer в базе данных


public class Customer
{
  ...
  public decimal? AccountBalance;
}
4 голосов
/ 13 апреля 2010

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

3 голосов
/ 15 апреля 2010

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

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

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

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

2 голосов
/ 13 апреля 2010

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

? a = null;//ok.
1 голос
/ 13 апреля 2010

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

Привет.

1 голос
/ 13 апреля 2010
// to replace   
// if(foo.Id > 0)
if(foo.Id.HasValue)
{
    Update(foo);
}
else
{
    Insert(foo);
}
...