Меня немного смущают нулевые значения и переменные в .NET. (Предпочтительно VB)
Есть ли способ проверить «пустоту» ЛЮБОЙ заданной переменной независимо от того, был ли это объект или тип значения? Или моя нулевая проверка всегда должна предвидеть, проверяет ли она тип значения (например, System.Integer) или объект?
Я предполагаю, что я ищу функцию, которая проверяет все возможные виды нулевого значения. То есть любой тип переменных, которые
а) никогда не присваивались значения с момента объявления
б) было присвоено нулевое значение из объекта данных (полученного из базы данных)
c) были установлены равными другому значению переменной, которое было нулевым
d) были установлены на переменную сеанса / приложения ASP.NET, которая никогда не была установлена или срок действия которой не истек.
Есть ли общие рекомендации по обработке нулевых сценариев в .NET?
Обновлено: Когда я говорю о типе значения, являющемся «нулевым», на самом деле я имею в виду тип значения, который либо никогда не устанавливался, либо в какой-то момент был установлен равным или приведенным из нулевого объекта.





Типы значений не могут быть нулевыми. Это нарушает то, что значит быть типом значения. Вы можете обернуть типы значений как Nullable (Of T), что дает вам отличный набор методов и проверки на отсутствие работы. Но с этой оболочкой у вас действительно много накладных расходов. Возможно, вы сможете уточнить, что вы пытаетесь сделать?
Для полноты синтаксис VB для оберток, допускающих значение NULL, выглядит так:
Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'
Обновлено: Тип значения всегда предварительно инициализируется значением по умолчанию, 0 для числовых значений, false для логических значений и т. д.
Переменные типа значения не могут содержать значение NULL, потому что значение NULL означает, что NULL означает, что ссылки никуда не указывают. Я не знаю на VB.net, но на C# вы можете обернуть типы значений как обнуляемые, используя «?», Например:
int? a = null;
int? это просто сокращение компилятора C# для Nullable <int>.
Это то, что тебе нужно?
if IsNothing(foo) OrElse IsDbNull(foo) Then
' Do Something Because foo Is Either Nothing or DBNull.Value
End If
По правде говоря, я не уверен, зачем вам такая структура. Единственный раз, когда я проверяю значение DBNULL.Value, - это когда я использую значения, полученные из базы данных, и до того, как я назначу указанное значение из класса пространства имен DATA какому-либо другому классу [т.е. dim b как строка = dataReader (0)].
Как правило, если вас беспокоит, что объект не был создан или требуется его повторное создание, тогда достаточно проверки IsNothing.
В .Net есть только два типа null, о которых я знаю, null (ничего в VB) и DbNull. Если вы используете System.Nullable, вы можете использовать тот же синтаксис проверки NULL, что и для объекта. Если ваш объект, допускающий значение NULL, помещен в коробку, среда CLR .Net 2.0 достаточно умен, чтобы найти правильный способ справиться с этим.
Единственный случай, когда я столкнулся с обоими типами, - это уровень данных приложения, где я мог бы напрямую обращаться к данным базы данных. Например, я столкнулся с DbNull в DataTable. Чтобы проверить оба этих нулевых типа в этой ситуации, вы можете написать метод расширения, например (извините, на C#):
static public bool IsNull(this object obj)
{
return obj != null && obj != DbNull.Value;
}
...
if (dataTable[0]["MyColumn"].IsNull())
{
//do something
}
Пока вы разрабатываете с Option Strict On, (а) не должно быть проблемой. Компилятор будет кричать на вас. Если вы беспокоитесь о проверке параметров, просто используйте
Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
if param1 is nothing then
Throw New ArgumentException("param1 cannot be null!")
end if
'param2 cannot be null
End Sub
Для (b) уровень взаимодействия с базой данных должен с этим справиться. Если вы используете LINQ, есть способы справиться с этим. Если вы используете типизированные наборы данных, в строке автоматически создается свойство .IsMyVariableNull.
Для (c) вам не нужно беспокоиться о типах значений, но ссылочные типы можно проверить с помощью простого Is Nothing (или IsNot Nothing).
Для (d) вы можете применить ту же логику после чтения. Проверьте переменную-получатель на значение Nothing.
По большей части простая проверка Is Nothing поможет вам. Уровень взаимодействия с базой данных поможет вам справиться с более жесткими случаями нулевых значений в ваших данных, но вам решать, как обрабатывать их соответствующим образом.
Обычные типы значений (логические, целые числа, длинные, плавающие, двойные, перечисления и структуры) не допускают значения NULL.
Значение по умолчанию для всех типов значений - 0.
CLR не позволит вам получить доступ к переменным, если они не установлены. Вы можете подумать, что это не всегда так, но иногда среда CLR инициализирует их за вас. На уровне метода вы должны явно инициализировать все переменные перед их использованием.
Кроме того, как отмечают другие, начиная с .net 2.0 существует новый общий тип, называемый Nullable<T>. В C# есть некоторые сокращения компилятора, такие как int? значит Nullable<int>, двойной? означает Nullable<double> и т. д.
Вы можете заключить Nullable<T> в оболочку только для типов значений, не допускающих значения NULL, и это нормально, поскольку ссылки уже могут иметь значение NULL.
int? x = null;
Для int ?, хотя вы можете проверить значение null, иногда лучше вызвать x.HasValue().
В C# также есть оператор объединения, допускающий значение NULL ?? когда вы хотите присвоить значение, допускающее значение NULL, для типа значения, не допускающего значения NULL. Но если у вас нет оператора, вы можете вызвать GetValueOrDefault ().
int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y
правило состоит в том, что для всех типов значений значение по умолчанию - 0. (int, long, float, double, enums, Structs и т. д.)