C#vs VB.NET-空结构的处理

C#vs VB.NET-空结构的处理,c#,vb.net,nothing,C#,Vb.net,Nothing,我偶然发现了这一点,想知道是否有人能解释为什么在VB.NET中它可以工作,而我却认为它应该失败,就像在C中一样# 但是在VB.NET中 Structure Person Public name As String End Structure ... Dim someone As Person = Nothing 'Wha? this is okay? Nothing与null不一样(Nothing!=null-LOL?),或者这只是处理两种语言之间相同情况的不同方法 为什么或者是什么在

我偶然发现了这一点,想知道是否有人能解释为什么在VB.NET中它可以工作,而我却认为它应该失败,就像在C中一样#

但是在VB.NET中

Structure Person
    Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
Nothing与null不一样(Nothing!=null-LOL?),或者这只是处理两种语言之间相同情况的不同方法

为什么或者是什么在两种情况下处理方式不同,使得其中一种情况可以,而另一种情况则不行

[更新]

考虑到一些评论,我把这件事搞砸了。。。如果您想在VB.NET中允许某些内容为null,似乎实际上必须使用Nullable。。。比如说

'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中的“Nothing”表示“默认值”。对于值类型,这是默认值;对于引用类型,这将是null。因此,不给结构赋值一点问题都没有。

nothing
大致相当于相关类型的
default(T)
。(刚刚选中,字符串也是如此-即,
在字符串上下文中没有任何内容是空引用。)

此外,结构是值类型(很像int、char等),因此不可为空。

我试图在MSDN上搜索它,但在VB端找不到任何相关内容。在C#上搜索“struct”时,它清楚地返回它是一个值类型,并且不能赋值为null,因为。。。这是一个价值观

然而,当查看VB.NET关键字“Structure”时,它并没有说“Value Type”。而是说

Structure语句定义了 您可以选择的复合值类型 定制

所以。。。反对


那是我的猜测。我想引用这个行为,但找不到任何引用。

因为一个结构可能由几个不同的类型组成(不是一个单一的值类型,而是几个不同类型的组合),询问它是否为“Nothing”会打破“Nothing”的使用逻辑。根据您正在测试的类型,没有什么测试是不同的,因此复杂类型不符合使用“Nothing”的逻辑。然而,对于这种类型的测试,也就是说,当一个结构的所有组件都处于各自的“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

那么使用null还是?(C#),可以将结构设置为null。这就是为什么当它在VB.NET中使用而不使用Nullable时,我感到非常震惊的原因。@HBoss:使用Nullable,您可以将任何内容设置为null!即使是
整数
。我对BFree接受的答案感到惊讶,幸运的是它回答了我的问题,并将我带到了这篇文章:如何用它的默认值初始化结构…;)否,对象将是
,默认为空。结构是一种复杂的值类型,可以由多个值甚至方法组成。与
的实际区别在于
结构
是用实际实例初始化的。用
Nothing
初始化它只是指定它应该设置为默认值,该值不是null(或者像我们在VB中通常说的那样:Nothing),我只是在将一些VB.NET移植到C#时偶然发现的,这让我更讨厌VB.NET;)。谢谢你们深入研究这个问题,也谢谢你们的回答。另请看@Charles,我应该因为C#不同于VB而恨它吗?有些人解决问题。有些人指责语言不同。是的,但我上次检查时,空字符串也没什么。
IsNothing(“”
”IsNothing
返回
True
。也许两者都有。如果两者都不是,那么差异就很严重。IsNothing(Employee)将永远不会计算为“true”,因为该类型不可为null
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