2014-05-19 24 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