[英]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 分別給了我以下錯誤:
編輯:對不起,我最初發布了一個代碼,我在 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.