VB.NET - Создать Nullable (Of T) с HasValue = False - PullRequest
3 голосов
/ 14 ноября 2011

Я работаю с базой данных SQL Server, в которой регулярно есть столбцы DateTime, которые могут быть нулевыми.Я использую LINQ to SQL для подключения моей программы WinForms (VB.NET) к данным.

Я расширил некоторые объекты LINQ и добавил пару свойств Nullable(Of DateTime).По сути, я рассчитываю, существует ли конкретное значение.Значение равно DateTime.Если он не существует, я хочу создать объект Nullable(Of DateTime) (структуру, что угодно) со свойством HasValue, установленным на False.

Я провел некоторое исследование и, по-видимому, конструктор Newна Nullable(Of T) создает один с HasValue, установленным в True.

Два вопроса:

  1. Почему это?Поскольку структура Nullable(Of T) была создана специально для ситуаций такого типа, почему поведение по умолчанию будет HasValue = True?
  2. Каков наилучший способ инициализации Nullable(Of T) на самом деле null?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Если вы предоставляете значение конструктору Nullable, оно будет иметь заданное значение, что приведет к описываемому вами сценарию, где HasValue - истина.

Чтобы объявить nullable с HasValue из false, вы можете воспользоваться одним из следующих подходов:

Dim x As Nullable(Of DateTime)
Dim y As DateTime?

Однако, если вы используете конструктор и предоставляете значение, структура с нулевым значением не будет иметь нулевого значения, и ее HasValue будет true:

Dim z As New Nullable(Of DateTime)(DateTime.Now)
2 голосов
/ 15 ноября 2011

Ответ Ахмада хорош.Существует также пустой конструктор, хотя, как ни странно, его нет в MSDN:

Dim x As New Nullable(Of DateTime)
Debug.Assert(x.HasValue = False)

Как и ожидалось, HasValue имеет значение false.Если у вас есть Nullable (T) со значением и вы хотите удалить это значение, вам просто нужно установить значение Nothing, как если бы это был ссылочный тип:

x = New Date(2011, 1, 1)
x = Nothing
Debug.Assert(x.HasValue = False)
...