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