C# vs VB.NET - Handling of null Structures

爱⌒轻易说出口 提交于 2019-11-29 16:20:45

问题


I ran across this and was wondering if someone could explain why this works in VB.NET when I would expect it should fail, just like it does in 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

But then in VB.NET...

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

Is Nothing not the same as null (Nothing != null - LOL?), or is this just different ways of handling the same situation between the two languages?

Why or what is handled differently between the two that makes this okay in one, but not the other?

[Update]

Given some of the comments, I messed with this a bit more... it seems as if you actually have to use Nullable if you want to allow something to be null in VB.NET... so for example...

'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'

Too weird...


回答1:


If I remember correctly, 'Nothing' in VB means "the default value". For a value type, that's the default value, for a reference type, that would be null. Thus, assigning nothing to a struct, is no problem at all.




回答2:


Nothing is roughly equivalent to default(T) for the relevant type. (Just checked, and this is true for strings as well - i.e. Nothing is a null reference in the context of strings.)




回答3:


I tried to search for it on MSDN but couldn't find anything relevant on the VB side. When searching for "struct" on C#, it clearly returns that it's a Value Type and can't be assigned null since... it's a value.

However, when looking on VB.NET keyword "Structure" it doesn't say "Value Type". Instead it says

The Structure statement defines a composite value type that you can customize.

So... object?

That would be my guess. I would like to have references to this behavior but couldn't find any.




回答4:


Also, structs are value types (much like int, char, etc.) and thus are non-nullable.




回答5:


Because a Structure is made up of possibly several different Types (not a single value Type, but a possible composite of several different types), to ask if it is "Nothing" would break the logic of the use of "Nothing". Nothing tests differently depending on the type that you're testing and therefore a complex type does not adhere to the logic of the use of "Nothing". However, for this type of testing, i.e., with a structure having all of its component members at their respective "Nothing" values, we use the function "IsNothing". For example:

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


来源:https://stackoverflow.com/questions/303502/c-sharp-vs-vb-net-handling-of-null-structures

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!