Ответ 1
Если я правильно помню, "Nothing" в VB означает "значение по умолчанию". Для типа значения это значение по умолчанию для ссылочного типа должно быть нулевым. Таким образом, не присваивая ничего структуре, это не проблема.
Я столкнулся с этим и задавался вопросом, может ли кто-нибудь объяснить, почему это работает в VB.NET, когда я ожидаю, что он потерпит неудачу, как в С#
//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?), или это просто разные способы обработки одной и той же ситуации между двумя языками?
Почему или что обрабатывается по-разному между двумя, что делает это хорошо в одном, но не в другом?
[Обновление]
Учитывая некоторые из комментариев, я испортил это немного больше... кажется, что вам действительно нужно использовать 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'
Слишком странно...
Если я правильно помню, "Nothing" в VB означает "значение по умолчанию". Для типа значения это значение по умолчанию для ссылочного типа должно быть нулевым. Таким образом, не присваивая ничего структуре, это не проблема.
Nothing
примерно эквивалентен default(T)
для соответствующего типа. (Только что проверено, и это верно и для строк, т.е. Nothing
является пустой ссылкой в контексте строк.)
Я попытался найти его в MSDN, но не смог найти что-либо релевантное на стороне VB. При поиске "struct" на С# он явно возвращает, что это Тип значения и не может быть назначен null, поскольку... это значение.
Однако при просмотре ключевого слова VB.NET "Структура" он не говорит "Тип значения". Вместо этого он говорит
Оператор Structure определяет тип составного значения, который вы можете настроить.
Итак... объект?
Это было бы моим догадком. Я хотел бы иметь ссылки на это поведение, но не смог найти.
Кроме того, структуры представляют собой типы значений (как и int, char и т.д.) и, следовательно, не являются нулевыми.
Поскольку структура состоит из, возможно, нескольких разных типов (а не одного значения Тип, но возможного композита из нескольких разных типов), чтобы спросить, является ли это "Ничто", нарушит логику использования "Ничего", Ничто не тестируется по-разному в зависимости от типа, который вы тестируете, и поэтому сложный тип не придерживается логики использования "Ничего". Однако для такого типа тестирования, то есть со структурой, имеющей все ее компоненты, в их соответствующих значениях "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