.Чистая значение dbnull против ничего все типы переменных?


Я немного запутался в пустых значениях и переменных в .NET. (VB предпочтительнее)

Есть ли способ проверить "пустоту" любой заданной переменной независимо от того, является ли она объектом или типом значения? Или моя проверка null всегда должна предвосхищать, проверяет ли она тип значения (например, System.Целое число) или объект?

Я думаю, что ищу функцию, которая проверяет все возможные виды null-ness. То есть любой тип переменных, который

А) никогда не были присвоено значение, так как объявлено

B) были присвоены нулевые значения из объекта данных (который пришел из базы данных)

C) были установлены равными другому значению переменной, которое было равно null

D) были установлены в ASP.NET переменная сеанса / приложения, которая никогда не была установлена или истекла.

Существует ли общая наилучшая практика, когда речь заходит об обработке нулевых сценариев в .NET?

UPDATE: Когда я говорю о типе значения "null", то на самом деле я имею в виду тип значения, который был либо никогда не установлен, либо в какой-то момент был установлен равным нулевому объекту или отлит из него.

6 6

6 ответов:

Нормальные типы значений (booleans, ints, longs, float, double, enum и structs) не могут быть обнулены.

Значение по умолчанию для всех типов значений равно 0.

Среда CLR не позволит вам получить доступ к переменным, если они не были заданы. Вы можете подумать, что это не всегда так, но иногда CLR вмешивается и инициализирует их для вас. На уровне метода необходимо явно инициализировать все переменные перед их использованием.

Далее, как указывают другие, начиная с .net 2.0 появилась новая универсальный тип называется Nullable<T>. Есть некоторые компиляторные сокращения в C#, как int? значит Nullable<int>, двойной? средства Nullable<double> и т. д.

Можно только обернуть Nullable<T> над типами значений, не допускающими обнуления, что нормально, поскольку ссылки уже имеют возможность быть нулевыми.

int? x = null;

Для int?, хотя вы можете протестировать против null, иногда лучше вызвать x.HasValue().

В C# есть также nullable coalescing operator ?? когда вы хотите присвоить значение null, чтобы необнуляемый тип значений. Но если у вас нет оператора, вы можете вызвать GetValueOrDefault ().

int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y

Типы значений не могут быть null. Это нарушает то, что означает быть типом значения. Вы можете обернуть типы значений как Nullable (Of T), что дает вам большой набор методов, и проверки на пустоту работают. Но у вас действительно много накладных расходов с этой оберткой. Может быть, вы объясните, что вы пытаетесь сделать?

Для полноты синтаксис VB для Обнуляемых оболочек выглядит следующим образом:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

EDIT: тип значения всегда предварительно инициализируется до значения по умолчанию, 0 для числовых значений, false для булевых значений и т. д.

Это то, что вам нужно?

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If
По правде говоря, я не совсем понимаю, зачем вам понадобилась эта структура. Единственный раз, когда я проверю ДБНУЛЛА.Значение - это когда я использую значения, полученные из базы данных, и перед тем, как присвоить указанное значение из класса пространства имен данных какому-либо другому классу [т. е. dim b as string = dataReader(0)].

Как правило, если вы обеспокоены тем, что объект не был создан, или нуждаетесь в его повторном создании, то достаточно просто проверки IsNothing.

В .Net это только два типа null, которые мне известны, null (nothing in VB) и DbNull. Если вы используете систему.Nullable, вы можете использовать тот же синтаксис проверки null, что и для объекта. Если ваш объект nullable помещен в коробку, среда CLR .Net 2.0 достаточно умна, чтобы понять, как правильно с этим справиться.

Единственный случай, когда я столкнулся с обоими типами, находится на уровне данных приложения, где я мог бы получить доступ к данным базы данных напрямую. Например, я столкнулся с DbNull в DataTable. Чтобы проверить оба этих типа null в этой конфигурации, вы можете написать метод расширения, например (извините, в C#):

static public bool IsNull(this object obj)
{
    return obj != null && obj != DbNull.Value;
}

...

if(dataTable[0]["MyColumn"].IsNull())
{
  //do something
}

Переменные типа Value не могут содержать null, потому что null означает, что null означает, что ссылки никуда не указывают. Я не знаю на чем. VB.net но на c# вы можете обернуть типы значений в nullables, используя "?", например:

int? a = null;

Пока вы развиваетесь с Option Strict On, (a) не должно быть проблемой. Компилятор будет кричать на вас. Если вы беспокоитесь о проверке параметров, просто используйте

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) вам не нужно беспокоиться о типах значений, но ссылочные типы можно проверить с помощью простого ничего (или не ничего).

Для (d) можно применить ту же логику после чтения. Проверьте принимающую переменную на пустоту.

По большей части, простая проверка ничего не даст вам. Уровень взаимодействия с базой данных поможет вам справиться с более жестким случаем нулевых значений в ваших данных, но это зависит от вас, чтобы обработать их соответствующим образом.