C # против VB.NET - Обработка нулевых структур - PullRequest
23 голосов
/ 20 ноября 2008

Я наткнулся на это и подумал, не мог бы кто-нибудь объяснить, почему это работает в 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?

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

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

[Update]

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

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

Ответы [ 5 ]

30 голосов
/ 20 ноября 2008

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

12 голосов
/ 20 ноября 2008

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

1 голос
/ 20 ноября 2008

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

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

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

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

Это было бы мое предположение. Я хотел бы иметь ссылки на это поведение, но не смог найти ни одного.

0 голосов
/ 29 июня 2013

Поскольку структура состоит из, возможно, нескольких различных типов (не одного типа значения, а возможного композита нескольких различных типов), вопрос о том, является ли это «Ничто», нарушил бы логику использования «Ничего». , Ничто не тестирует по-разному в зависимости от типа, который вы тестируете, и поэтому сложный тип не придерживается логики использования «Ничего». Однако для этого типа тестирования, т. Е. Со структурой, в которой все ее компоненты-компоненты имеют соответствующие значения «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
0 голосов
/ 20 ноября 2008

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

...