You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建"="运算符以检查Structure类型是否为null

问题解答

首先明确:你要实现的功能是可行的,但你的写法有误——Nothing不是类型,不能用来定义参数类型,这就是你报错的直接原因。

原理梳理

VB里的Structure是值类型,和类(引用类型)本质不同:值类型的变量永远不会是引用意义上的"null",当你写myStruct = Nothing时,VB实际是把该变量设为对应值类型的默认实例(所有字段取默认值,比如数值为0、字符串为Nothing)。但如果你想自定义"空"的判断规则(比如某字段为空时视为结构"空"),可以通过重载=和<>运算符来实现。

正确实现方案

  1. 先给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
  1. 调用时即可直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:42:34