如何创建"="运算符以检查Structure类型是否为null
问题解答
首先明确:你要实现的功能是可行的,但你的写法有误——Nothing不是类型,不能用来定义参数类型,这就是你报错的直接原因。
原理梳理
VB里的Structure是值类型,和类(引用类型)本质不同:值类型的变量永远不会是引用意义上的"null",当你写myStruct = Nothing时,VB实际是把该变量设为对应值类型的默认实例(所有字段取默认值,比如数值为0、字符串为Nothing)。但如果你想自定义"空"的判断规则(比如某字段为空时视为结构"空"),可以通过重载=和<>运算符来实现。
正确实现方案
- 先给
PhoneNumber结构添加自定义的"空"判断逻辑,再重载运算符:
Public Structure PhoneNumber ' 示例字段,根据你的实际结构调整 Public AreaCode As String Public LineNumber As String ' 自定义判断结构是否为"空"的规则 Public ReadOnly Property IsEmpty As Boolean Get ' 这里按你的需求定义"空"的条件,比如核心字段为空 Return String.IsNullOrEmpty(AreaCode) AndAlso String.IsNullOrEmpty(LineNumber) End Get End Property ' 重载=运算符,处理和Object的比较(包含Nothing场景) Public Shared Operator =(left As PhoneNumber, right As Object) As Boolean ' 处理right是Nothing的情况 If right Is Nothing Then Return left.IsEmpty End If ' 处理right是PhoneNumber实例的情况 If TypeOf right Is PhoneNumber Then Dim rightNum As PhoneNumber = DirectCast(right, PhoneNumber) ' 比较结构所有字段,保证相等逻辑一致 Return left.AreaCode = rightNum.AreaCode AndAlso left.LineNumber = rightNum.LineNumber End If ' 其他类型直接返回不相等 Return False End Operator ' 必须同时重载<>运算符,逻辑与=相反 Public Shared Operator <>(left As PhoneNumber, right As Object) As Boolean Return Not (left = right) End Operator ' 建议重写Equals和GetHashCode,保证逻辑一致性 Public Overrides Function Equals(obj As Object) As Boolean Return Me = obj End Function Public Overrides Function GetHashCode() As Integer ' 根据结构字段生成哈希值,示例: Return HashCode.Combine(AreaCode, LineNumber) End Function End Structure
- 调用时即可直接使用
If num = Nothing Then:
Friend Sub Foo(num As PhoneNumber) If num = Nothing Then ' 处理空结构逻辑 Else ' 处理非空结构逻辑 End If End Sub
关键注意点
- 重载
=必须同时重载<>,否则编译器会报错; - 不要用
IsDBNull判断结构是否为空,IsDBNull是专门用于数据库字段DBNull类型的判断,和值类型的"空"无关; - 重写
Equals和GetHashCode是为了保证使用Equals方法或哈希集合时,逻辑和运算符重载保持一致。
内容的提问来源于stack exchange,提问作者John89
相关产品推荐
相关产品推荐

