Вопрос

Меня немного смущают нулевые значения и переменные в .NET.(предпочтительно ВБ)

Есть ли способ проверить «нулевое значение» ЛЮБОЙ заданной переменной независимо от того, был ли это объект или тип значения?Или моя проверка на значение null должна всегда предвидеть, проверяется ли она тип значения (например,System.Integer) или объект?

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

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

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

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

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

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

ОБНОВЛЯТЬ: Когда я говорю о типе значения, являющемся «нулевым», я на самом деле имею в виду тип значения, который либо никогда не устанавливался, либо в какой-то момент был установлен равным или приведен к нулевому объекту.

Это было полезно?

Решение

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

Другие советы

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

Для полноты синтаксис VB для оболочек Nullable:

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

РЕДАКТИРОВАТЬ:Тип значения всегда предварительно инициализируется значением по умолчанию: 0 для числовых значений, false для логических значений и т. д.

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

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If

По правде говоря, я не уверен, почему вам нужна эта структура.Единственный раз, когда я проверяю DBNULL.Value, это когда я использую значения, полученные из базы данных, и прежде чем я назначу указанное значение из класса пространства имен DATA какому-либо другому классу [т.е.dim b as string = dataReader(0)].

Обычно, если вас беспокоит, что объект не был создан или требуется его повторное создание экземпляра, то будет достаточно простой проверки IsNothing.

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

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

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

...

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

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

int? a = null;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top