Вызов конструктора из общего метода (C# в VB. Net) - PullRequest
1 голос
/ 02 февраля 2020

У меня недостаточно опыта в 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 - это другой класс, который у меня есть в приложении с методом stati c Show). Все отлично работает в C#, но в Visual Basi c. NET Я не могу вызвать конструктор. Конструктор стал:

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

Но что такое VB. NET эквивалент для new classname(parameters)? Что я пробовал:

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. Это, очевидно, не работает, потому что Метод shared / stati c не может вызвать экземпляр
  3. «Синтаксическая ошибка»

РЕДАКТИРОВАТЬ: Извините за ошибку, я первоначально разместил код, в котором я передавал три аргумента в функциях VB. NET. Однако в моем реальном коде функции имеют больше аргументов, и я уверен, что это не проблема. Я подумал, что было бы яснее, если бы я показал вам только необходимый код, поскольку полный код слишком длинный, но забыл удалить дополнительные аргументы в некоторых функциях

Ответы [ 4 ]

2 голосов
/ 02 февраля 2020

В VB. NET вы должны использовать временную переменную:

Dim tempVar As New MyForm(caption)
1 голос
/ 02 февраля 2020

Существенная проблема здесь заключается в том, что 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]
0 голосов
/ 09 февраля 2020

Для такого рода вопросов существует много конвертеров C# в VB, включая как минимум 2 бесплатных открытых источника, которые сделают преобразование за вас. Один мой на https://github.com/paul1956/CSharpToVB

0 голосов
/ 02 февраля 2020

Ваш MyForm конструктор принимает только один параметр, а ваш Show метод неверен и должен быть таким, чтобы возвращать вновь созданный экземпляр.

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

Реальная проблема здесь - ваш дизайн, вы не должно быть никакой логики c, реализованной внутри вашего конструктора.

Что-то вроде этого

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...