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

VB.NET使用对象初始化器创建实例时,构造函数中属性为空问题咨询

VB.NET对象初始化器中构造函数访问属性为空的问题

你遇到的问题核心是对象初始化器的执行顺序:当你用New TheClass With {.TheProperty = "value"}这种语法时,.NET会先调用TheClass的无参构造函数Sub New(),完成对象的基础初始化,之后才会执行对象初始化器里的属性赋值操作。所以在Sub New()内部访问TheProperty时,它还没被赋值,自然是空的。

解决方案

1. 将属性值作为构造函数参数传递

这是最直接的方式,把需要的属性值传入构造函数,在构造过程中直接初始化属性并使用:

Public Class TheClass
    Public TheProperty As String
    Public Sub New(propertyValue As String)
        TheProperty = propertyValue
        ' 这里可以正常使用TheProperty
        Console.WriteLine("构造函数中TheProperty的值:" & TheProperty)
    End Sub
End Class

Module TheModule
    Sub Main()
        Dim myClass As New TheClass("value")
    End Sub
End Module

2. 分离初始化逻辑到构造后执行

如果必须使用对象初始化器,可以把依赖TheProperty的逻辑移到构造函数之外,通过单独的初始化方法触发:

Public Class TheClass
    Public TheProperty As String
    Public Sub New()
    End Sub

    ' 单独的初始化方法
    Public Sub Setup()
        Console.WriteLine("初始化方法中TheProperty的值:" & TheProperty)
    End Sub
End Class

Module TheModule
    Sub Main()
        Dim myClass As New TheClass With {.TheProperty = "value"}
        myClass.Setup()
    End Sub
End Module

3. 通过属性Setter触发逻辑

如果逻辑只需要在属性赋值时执行,可以把逻辑写在属性的Setter里(注意要把字段和属性分开,避免递归):

Public Class TheClass
    Private _theProperty As String
    Public Property TheProperty As String
        Get
            Return _theProperty
        End Get
        Set(value As String)
            _theProperty = value
            ' 在这里处理属性赋值后的逻辑
            Console.WriteLine("属性赋值时TheProperty的值:" & _theProperty)
        End Set
    End Property

    Public Sub New()
    End Sub
End Class

Module TheModule
    Sub Main()
        Dim myClass As New TheClass With {.TheProperty = "value"}
    End Sub
End Module

关于你看到的其他案例

你见过别人用这种对象初始化器但没出问题,大概率是因为那些类的构造函数里没有依赖这些初始化器设置的属性,或者他们的业务逻辑是在构造完成后(也就是属性赋值后)才执行的,比如在后续的方法调用中使用属性,而非构造函数内部。

内容的提问来源于stack exchange,提问作者J. Verhagen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:00:08