我的课程类似如下:
Public Class Form1
Private d As New Dings("dings")
End Class
Public Class Foo
Public Sub New(ByVal aName As String)
MsgBox("new Foo """ & aName & """")
End Sub
End Class
Public Class Dings
Public Property Name As String
Public Property MyFoo As New Foo(Name)
Public Sub New(ByVal aName As String)
_Name = aName
End Sub
End Class
我希望Dings类的Name属性首先被初始化,但它是相反的,你有任何想法如何实现这一点? 我知道,我也可以在构造函数的后面创建foo-object(作为dings的成员)。 但是我想这样做,因为最后在Dings类中实例化了很多单例对象,我想在一行中创建它们。 关于哎呀
####### E D I T ############# 非常感谢你们俩。我想扩大我的问题: 那么C#怎么样,有没有可能按照我自己定义的顺序初始化变量?答案 0 :(得分:4)
Public Property MyFoo As New Foo(Name)
As New语法导致问题。延迟初始化在这里不起作用,编译器在构造函数中生成代码以初始化MyFoo属性。这个注入的代码总是在你自己编写的任何代码之前运行。
没有干净的修复,您将不得不使用私人支持字段:
Public Class Dings
Public Property Name As String
Private fooBacking As Foo
Public Property MyFoo As Foo
Get
Return fooBacking
End Get
Set(ByVal value As Foo)
fooBacking = value
End Set
End Property
Public Sub New(ByVal aName As String)
_Name = aName
MyFoo = New Foo(_Name)
End Sub
End Class
答案 1 :(得分:2)
您应该直接从构造函数初始化MyFoo属性:
Public Class Form1
Private d As New Dings("dings")
End Class
Public Class Foo
Public Sub New(ByVal aName As String)
MsgBox("new Foo """ & aName & """")
End Sub
End Class
Public Class Dings
Public Property Name As String
Public Property MyFoo As Foo
Public Sub New(ByVal aName As String)
Name = aName
MyFoo = New Foo(aName)
End Sub
End Class
这是推荐的方式(在我看来),因为你保持对序列属性的完全控制被初始化。实际上这是一个很好的例子。
但这取决于对象的类型以及它是否与其他成员或条件有关:
答案 2 :(得分:0)
要回答C#部分内容,C#中的初始化顺序为:
请注意,在C#中,无论如何都无法写出来:
Public Property Name As String
Public Property MyFoo As New Foo(Name)
为了表明我对后一点的意思,这个类在C#中无效:
class Test
{
string x;
string y = x;
}
生成此编译时错误:
Test.cs(6,16):错误CS0236:字段初始化程序无法引用非静态字段,方法或属性“Test.x”