对象初始化

时间:2011-01-27 20:51:28

标签: c# vb.net constructor singleton

我的课程类似如下:

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#怎么样,有没有可能按照我自己定义的顺序初始化变量?

3 个答案:

答案 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

这是推荐的方式(在我看来),因为你保持对序列属性的完全控制被初始化。实际上这是一个很好的例子。

但这取决于对象的类型以及它是否与其他成员或条件有关:

内联初始化

  • 对象是常量
  • object是一个值类型,不依赖于特殊条件(如timestamp)
  • object是引用类型,但使用默认构造函数进行初始化

构造

  • 对象取决于此类的其他成员
  • 对象具有特殊条件(f.e.Date.Now)
  • 类有很多成员:一些是内联初始化的,一些在构造函数中使它不太可读,考虑在构造函数中完成初始化

答案 2 :(得分:0)

要回答C#部分内容,C#中的初始化顺序为:

  • 一切都以类型的默认值(null,0等)
  • 开头
  • 作为字段声明一部分的作业以文本顺序(即它们出现在源代码中的顺序)执行。请注意,对于部分类,这会导致一些歧义。
  • 执行基类构造函数
  • 执行构造函数体

请注意,在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”