2014-05-19 28 views
-1

嘿,我将一些C#代码转换为VB.net,并注意到C#代码有一个公共子新()。 C#代码是这样的:VB.net公共子新()发射功能

private readonly SController _controller; 

public SView():this(new SController()) { } 

public SView(SController controller) 
{ 
    InitializeComponent(); 
    _controller = controller; 
    controller.EnumerateDevices(deviceDropdown.Items); 
    _thread = new Thread(ReadLoop) {IsBackground = true}; 
    _thread.Start(); 
} 

并转换上面VB.net:

Private ReadOnly _controller As SController 

Public Sub New() 
    Me.New(New SController()) 
End Sub 

Public Sub New(controller As SController) 
    InitializeComponent() 
    _controller = controller 
    controller.EnumerateDevices(deviceDropdown.Items) 
    _thread = New Thread(AddressOf ReadLoop) With { _ 
     .IsBackground = True _ 
    } 

    _thread.Start() 
End Sub 

我遇到的问题是,由于VB开头:

Private Sub SView_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

如何我可以告诉它关闭Public Sub New()函数吗?

我试图只是把:

Private Sub SView_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Me.New(New SController()) 
End Sub 

但它给我的错误:

Constructor call is valid only as the first statement in an instance constructor. 

任何帮助将是巨大的,解决这个问题!

更新

Private Sub SView_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Dim _sView As New SView 
End Sub 

它从来没有击中,当我把一个突破上线昏暗_sView作为新SView负载

+3

'Sub New'是构造函数,它将在C#中同时触发 - 当您创建对象时。 – GSerg

回答

0

如果你想调用逻辑构造在已经构建的实例,你需要重构搬出constructoir的是逻辑:然后

Private ReadOnly _controller As SController 

Public Sub New() 
    Me.New(New SController()) 
End Sub 

Public Sub New(controller As SController) 
    Initialize(controller) 
End Sub 

Private Sub Initialize(controller As SController) 
    InitializeComponent() 
    _controller = controller 
    controller.EnumerateDevices(deviceDropdown.Items) 
    _thread = New Thread(AddressOf ReadLoop) With { _ 
     .IsBackground = True _ 
    } 

    _thread.Start() 
End Sub 

,而不是调用Me.New(New SController())你”请致电Me.Initialize(New SController())

+0

** Me.Initialize(新SController())**不起作用。 ** Error'Initialize'的错误不是'S.View.SView'的成员。** – StealthRT

+0

对我的错误的答复,D Stanley? – StealthRT

+0

你是从视图内调用它吗?我把它看作是私人的,所以不能从视图外部调用,但是如果你需要的话,你可以公开它。 –

1

我怎么能告诉它关火公用Sub New()函数?

你不行。 Sub New()是你的类的构造函数,它被执行来初始化类的一个实例。创建对象后无法调用它。

+0

那么我会怎样去解决** Public Sub New()**函数,以便** New(controller As ScaleController)**也会被触发? – StealthRT

1

当表单被实例化并且在Load事件触发之前,默认的构造函数(没有任何参数的构造函数)被调用。如果你想验证这一点,在构造函数中放置一个断点并调试你的解决方案。

+0

然后,我会怎样去解决** Public Sub New()**函数,以便** New(controller As ScaleController)**也会启动? – StealthRT

+0

每当创建一个新的Form1就像这样:Dim Form1()作为新的Form1(),默认的构造函数被调用。在这种情况下,默认构造函数调用参数化构造函数,传递一个新的SController。 –

+1

我觉得你可能需要刷新你在.NET中的构造知识:http://msdn.microsoft.com/en-us/library/2z08e49e%28v=vs.90%29.aspx –

1

Sub New在创建新实例时被调用。
“Sub New”===>“Dim foo As New FooBar”明白吗?

有些混乱可能是因为您SView构造超载:

Dim _sView As New SView 
' or 
Dim _ctrlr As New SController 
Dim _sView As New SView(_ctrlr) 

在第一种情况下,你的SView将:

' simple constructor 
Public Sub New() 
    Me.New(New SController())  ' calls overload below 
End Sub 

Public Sub New(controller As SController) 

    InitializeComponent()   ' this is apparently a form???? 

    _controller = controller 
    controller.EnumerateDevices(deviceDropdown.Items) 
    _thread = New Thread(AddressOf ReadLoop) With { _ 
     .IsBackground = True } 

    _thread.Start() 
End Sub 

它可以具有或不具有到控制器的基准被称为创建自己的新控制器。第二,它将使用在构造函数调用中传递给它的那个(New SView(_ctrlr))。在均为的情况下,你的新对象将会有有一个控制器对象。

在一个新的类对象不应该没有构造函数ARG存在,只是删除简单的(空的)构造函数,因此抛出一个异常情况:

Dim emp As New Employee(empName) 
' this one fails if you remove the "Sub New()": 
Dim emp As New Employee() 

如果您只想来创建新实例你创建的控制器,只需删除简单/空的构造函数。

EDIT

It never hits the Load when I put a break on line [Dim _sView As New SView]

加载形式是不一样的创建表单实例。表单只是类,并且Load事件被称为您首次使用时调用Show方法的对象。这是一个好的的事情,因为它允许我们创建一个表单实例并使用它之前它显示。更长的符号:

Dim _sView As SView   ' simple DECLARES the object name and type 
_sView = New SView   ' create instance (exec [Sub new]) 
_sView.FormSetup    ' do some first time only stuff 
_sView.Show     ' show the form (fires [Load] event) 

FormSetup可能是一个方法,我写的是一些任务要做只使用它的第一次。如果我随后只是Hide表格,我可以跳过所有这些,而不是在Load事件中。然而,评论解释了每条线的情况。

+0

请看我的更新OP。 – StealthRT

+0

请参阅编辑 - 创建新实例不会导致表单加载 - 只有在显示时才会发生。 – Plutonix