C # против VB.NET - обработка нулевых структур

Я натолкнулся на это и подумал, может ли кто-нибудь объяснить, почему это работает в VB.NET, когда я ожидал, что он потерпит неудачу, как и в C #.

//The C# Version

struct Person {
    public string name;
}
...
Person someone = null; //Nope! Can't do that!!
Person? someoneElse = null; //No problem, just like expected

Но тогда в VB.NET ...

Structure Person
    Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?

Разве Nothing не то же самое, что null (Nothing! = Null - LOL?), или это просто разные способы обработки одной и той же ситуации между двумя языками?

Почему или что по-разному обрабатывается между двумя, что делает это приемлемым для одного, но не для другого?

[Обновление]

Учитывая некоторые комментарии, я немного напортачил с этим ... кажется, что вам действительно нужно использовать Nullable, если вы хотите, чтобы что-то было нулевым в VB.NET ... так, например ...

'This is false - It is still a person'
Dim someone As Person = Nothing
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) 'false'

'This is true - the result is actually nullable now'
Dim someoneElse As Nullable(Of Person) = Nothing
Dim isSomeoneElseNull As Boolean = someoneElse.Equals(Nothing) 'true'

Слишком странно...


person hugoware    schedule 19.11.2008    source источник
comment
Я только что наткнулся при портировании некоторого VB.NET на C # - я еще больше ненавижу VB.NET;). Спасибо, что вникнули в это, и спасибо тем, кто ответил.   -  person Charles    schedule 07.12.2010
comment
См. Также stackoverflow.com/questions/5869661/   -  person jeroenh    schedule 25.04.2014
comment
@ Чарльз, я должен ненавидеть C # за то, что он отличается от VB? Некоторые люди решают проблемы. Некоторые винят языки в том, что они разные.   -  person Dima    schedule 27.08.2016


Ответы (5)


Если я правильно помню, «Ничего» в VB означает «значение по умолчанию». Для типа значения это значение по умолчанию, для ссылочного типа это будет null. Таким образом, ничего не присваивать структуре - это вообще не проблема.

person BFree    schedule 19.11.2008

Nothing примерно эквивалентен default(T) для соответствующего типа. (Только что проверил, и это верно и для строк, т. Е. Nothing - это пустая ссылка в контексте строк.)

person Jon Skeet    schedule 19.11.2008
comment
Да, но в последний раз, когда я проверял, пустая строка тоже Nothing. Либо IsNothing(""), либо "" Is Nothing возвращает True. Может и то, и другое. Если не то и другое, то несоответствие просто ужасное. - person ; 20.04.2011

Я попытался найти его в MSDN, но не нашел ничего подходящего на стороне VB. При поиске слова «struct» на C # он явно возвращает, что это тип значения и ему не может быть присвоено значение null, поскольку ... это значение.

Однако, когда вы смотрите на ключевое слово VB.NET «Структура», оно не говорит «Тип значения». Вместо этого он говорит

Оператор Structure определяет тип составного значения, который можно настроить.

Итак ... объект?

Это было бы мое предположение. Я хотел бы получить ссылки на такое поведение, но не нашел.

person Maxime Rouiller    schedule 19.11.2008
comment
Нет, объект будет Class, который по умолчанию имеет значение null. Структура - это сложный тип значения, который может состоять из нескольких значений и даже методов. Практическое отличие от Class состоит в том, что Structure инициализируется фактическим экземпляром. Инициализация его с помощью Nothing просто указывает, что для него должно быть установлено значение по умолчанию, которое НЕ является нулевым (или, как мы обычно говорим в VB: Nothing) - person awe; 11.12.2009

Кроме того, структуры являются типами значений (во многом как int, char и т. Д.) И, следовательно, не допускают значения NULL.

person Dana    schedule 19.11.2008
comment
Ну что, используя Nullable или? (C #), вы можете сделать структуру null. Вот почему я был так шокирован, когда он работал с VB.NET без использования Nullable. - person hugoware; 20.11.2008
comment
@HBoss: Используя обнуляемое значение, вы можете сделать НУЛЕЕ ВСЕ! Даже Integer. Я был удивлен принятым ответом BFree, и, к счастью, он ответил на мой вопрос, который привел меня к этому сообщению: как вы можете инициализировать структуру со значением по умолчанию ...;) - person awe; 11.12.2009

Поскольку структура состоит, возможно, из нескольких различных типов (не из одного типа значения, а из нескольких различных типов), вопрос о том, является ли она «Ничего», нарушит логику использования «Ничего». Ничто не тестируется по-разному в зависимости от типа, который вы тестируете, и поэтому сложный тип не соответствует логике использования «Ничего». Однако для этого типа тестирования, то есть со структурой, все члены которой имеют соответствующие значения «Nothing», мы используем функцию «IsNothing». Например:

Public Class Employees
    Public Structure EmployeeInfoType
       Dim Name As String    ' String
       Dim Age as Integer    ' Integer
       Dim Salary as Single  ' Single
    End Structure

    Private MyEmp as New EmployeeInfoType

    Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean
       If **IsNothing**(Employee) Then
          Return True
       Else
          Return False
       End If
    End Function
End Class
person piBoss    schedule 29.06.2013
comment
IsNothing (Employee) никогда не будет оценивать значение true, потому что тип не допускает значения NULL - person Bernoulli Lizard; 01.08.2019