【问题标题】:how to deal with chaining constructors and InitializeComponent in a .net form如何以 .net 形式处理链式构造函数和 InitializeComponent
【发布时间】:2012-11-06 07:12:03
【问题描述】:

假设我有两个 windows 窗体的构造函数

Sub New (byref Foo as Foo)
    InitializeComponent()
    ...do some work
End Sub

Sub New (byref Foo as Foo, Bar as Bar)
    InitializeComponent()
    _bar = Bar
    Me.New(Foo)
End Sub

使用第二个构造函数时,InitializeComponent 会被调用两次。那样行吗?我应该尝试阻止它吗?如何?

您可能会说我可以从第二个构造函数中消除它,但我可以在调用 InitializeComponent 之前开始进行分配(如 _bar = Bar)吗? 在调用 InitializeComponent 之前,是否有关于您应该做什么或不应该做什么的指导方针?或者是否可以安全地调用它两次而没有任何实际后果?

干杯!

【问题讨论】:

    标签: windows vb.net winforms constructor


    【解决方案1】:

    只在最深的构造函数中调用InitializeComponent(参数数量最多)。然后链接其他构造函数来调用这个构造函数并为丢失的参数提供默认值。

    这里是 C# 示例

    public MyForm(Foo foo)
      : this(foo, null)
    {   
    }
    
    public MyForm(Foo foo, Bar bar)
    {
       InitializeComponent();
       _bar = bar;
       // do some work
    }
    

    我相信 VB 会是这样的

    Public Sub New(foo As Foo)
        Me.New(foo, Nothing)
    End Sub
    
    Public Sub New(foo As Foo, bar As Bar)
        InitializeComponent()           
        _bar = bar
        ' do some work
    End Sub
    

    【讨论】:

      【解决方案2】:

      在这种情况下,操作的顺序并不重要,所以我可以简单地立即调用最终的构造函数,然后在它返回时执行我的特殊任务:

      Public Sub New(ByVal wpPost As WordPressPost, URLs As String())
          Me.New(wpPost)
          _URLs = URLs
      End Sub
      
      Public Sub New(ByVal wpPost As WordPressPost)
          InitializeComponent()
          _wppost = wpPost
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多