簡體   English   中英

從共享方法調用構造函數(C# 到 VB.Net)

[英]Calling constructor from shared method (C# to VB.Net)

我在 VB.NET 方面沒有足夠的經驗,我有一個 Windows Forms VB.NET 應用程序,我正在嘗試在 C# 中做我會用這種方式做的事情:

public class MyForm{    
    MyForm(string caption) {
        _caption = caption;
        if(...){
            BaseForm.Show(caption);
      }
    }

    public static void Show(string caption) {
        new MyForm(caption);
    }
}

(BaseForm 是我在應用程序中使用靜態方法 Show 的另一個類)。 在 C# 中一切正常,但在 Visual Basic .NET 中我無法調用構造函數。 構造函數變成了:

Public Sub New(ByVal caption As String)
        _caption = caption
        If ...
            BaseForm.Show(caption)
        End If
End Sub

但是new classname(parameters)的 VB.NET 等價物是什么? 我試過的:

Public Shared Sub Show(ByVal caption As String)
    MyForm.New(caption)
End Sub 

Public Shared Sub Show(ByVal caption As String)
    Me.New(caption)
End Sub

Public Shared Sub Show(ByVal caption As String)
    New MyForm(caption)
End Sub

這些都不起作用。 似乎在線 C#-VB.NET 轉換器給了我第三個選項作為答案(我不會嘗試),但這是錯誤的。 VS 2017 分別給了我以下錯誤:

  1. “構造函數調用僅作為
    實例構造函數”
  2. 這顯然不起作用,因為共享/靜態方法不能調用實例
  3. “語法錯誤”

編輯:對不起,我最初發布了一個代碼,我在 VB.NET 函數中傳遞了三個參數。 然而,在我的真實代碼中,函數有更多的參數,我確信這不是問題。 我認為如果我只向您展示基本代碼會更清楚,因為完整代碼太長但忘記刪除某些函數中的附加參數

在 VB.NET 中,你應該使用一個臨時變量:

Dim tempVar As New MyForm(caption)

這里的基本問題是 VB 不允許“裸”表達式是語句。 C#(和 Java)將表達式限制為以下語句:

  • 賦值表達式
  • 任何使用 ++ 或 --
  • 方法調用
  • 對象創建表達式

關於前兩點,VB 有一些等價物。 VB 沒有內置的賦值表達式; 相反,它有一個賦值語句。 VB 沒有++--運算符; 它只有+=-=賦值語句。 在任何情況下,通過輔助函數可以在 VB 中完全模擬它們。

以上幾點中,VB中只允許“方法調用”之一。 “對象創建表達式”不是。

所以像New MyForm()這樣的東西是一個表達式,盡管假裝是Sub New() 最直接的解決方法是使用局部變量(正如其他人已經建議的那樣):

Dim tmp As New MyForm(Text, caption, timeout)

另一個想法是使用With

With New MyForm(Text, caption, timeout) : End With

如果您認為這是您將經常做的事情,也許您可​​以向您的類添加一個不執行任何操作的私有或受保護方法:

    Private Sub NoOp()
    End Sub

並像這樣使用它:

Call New MyForm(Text, caption, timeout).NoOp()

這是有效的,因為Call語句允許在獲取方法調用的過程中使用表達式。

或者,您可以在Module創建一個輔助函數,如下所示:

#Disable Warning IDE0060 ' Remove unused parameter
    Friend Sub [Call](Of T)(x As T)
#Enable Warning IDE0060 ' Remove unused parameter
    End Sub

然后用它做這個:

[Call](New MyForm(Text, caption, timeout)) ' Note square brackets on [Call]

你的MyForm構造函數只接受一個參數,你的Show方法是錯誤的,應該像這樣返回新創建的實例。

Public Shared Function Show(ByVal caption As String) As MyForm
    Return New MyForm(caption)
End Function

這里真正的問題是您的設計,您不應該在構造函數內部實現任何邏輯。

像這樣的東西

Public Sub Show()
    BaseForm.Show(_caption)
End Sub

Public Shared Sub Show(ByVal caption As String)
    Dim form = New MyForm(caption)
    form.Show()
End Sub

對於這些類型的問題,有許多 C# 到 VB 轉換器,包括至少 2 個免費開源一次可以為您進行轉換。 一個是我在https://github.com/paul1956/CSharpToVB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM