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
相关产品推荐
相关产品推荐

