2013-11-19 4 views
6

Я поддерживаю приложение, которое имеет как компоненты VB.NET, так и C#. Я думал, что эти два языка отличаются только синтаксисом, но я нашел странную функцию в VB.NET, которой нет в C#.Объекты, неявно созданные в vb.net?

В VB.NET, у меня есть следующий класс:

Public Class bill_staff Inherits System.Windows.Forms.Form 
    .... 
End Class 

Если я хочу использовать этот класс в C#, я делаю это:

using (var frm = new bill_staff()) 
    frm.ShowDialog(); 

Однако в VB.NET код, класс может быть использован, как это:

bill_staff.ShowDialog(); 

ShowDialog определяется в метаданных, как это:

Public Function ShowDialog() As System.Windows.Forms.DialogResult 

Таким образом, в VB.NET можно вызвать метод экземпляра для класса. Насколько я могу судить, это неявно создает новый экземпляр класса, а затем вызывает метод на этом объекте. В C# это невозможно: в классе должны быть вызваны статические методы, а объекты объектов должны быть вызваны.

Я не могу найти информацию об этом в Интернете. Какая функция называется, и это хорошая практика?

Проект был первоначально преобразован из VB6 - это какая-то странная унаследованная функция?

+0

вам нужно будет создать новый экземпляр класса перед вызовом ShowDialog() – Ric

+0

@Ric У вас нет. Он компилируется и работает нормально. – Oliver

+0

Хорошо, что функция Function является методом экземпляра, а не методом класса (т. Е. Не является общей функцией). Я считаю, что это довольно странно ... это объект, который не создается в другом месте? – Ric

ответ

10

Да, это устаревшее поведение. Классы не отображались в VB до v4, до этого Form1.Show был The Way для отображения форм. Чтобы сохранить предыдущий код совместимым (VB3 также был очень популярен), старый метод поддерживался.

Он по-прежнему поддерживается в .NET как законное средство для отображения форм. Первоначально это было добавлено, чтобы упростить перенос кода VB6 на VB.NET. Но также для облегчения работы в VB-MS это относится к функции у вас под рукой и аналогичные фразы.

В принципе, он обеспечивает легкий способ программирования без понимания объектов и ООП. Представьте себе вопросы, которые у нас были бы здесь, если бы Form1.Show забросил ошибку.

Явный стимул является лучшим методом, поскольку он объектно ориентирован и делает его менее вероятным, если ваш код будет ссылаться - или создавать - новый Form2, когда вы действительно хотели использовать существующий экземпляр.

+1

+1. Документация VB6 объясняет это [здесь] (http://msdn.microsoft.com/en-us/library/aa262343 (v = vs.60) .aspx). Документация VB.net упоминает ее кратко [здесь] (http://msdn.microsoft.com/en-us/library/vstudio/87y2hdsf.aspx), но не объясняет, почему она существует (устаревший код). Это объясняется в этой [технической статье MSDN на VB2005] (http://msdn.microsoft.com/en-us/library/ms379610 (v = vs.80) .aspx # vbmy_topic3) в разделе 'My.Forms' – MarkJ

+0

@Plutonix - Вы говорите, что вручную настраивать форму лучше, потому что вы думаете, что это связано с некоторыми накладными расходами, но не тратит время на то, что .NET создает для вас на заднем плане отходы в себе, если вы не используете их ? Выполнение того же самого действия дважды эффективно ... – Keith

+1

NET не создает его в фоновом режиме, VB делает, когда вы используете метод экземпляра по умолчанию ('Form1.Show'). Ничего не теряется, потому что 'Dim frm As New Form1()' создает только один экземпляр формы. Использование экземпляра по умолчанию может вызвать множество проблем, связанных с областью ... – Plutonix

4

Для форм, VB создает экземпляр по умолчанию для вас за кулисами. , например, следующий В.Б.:

Public Class bill_staff 
    Inherits System.Windows.Forms.Form 
End Class 

class testclass 
    sub testmethod() 
     bill_staff.Show() 
    end sub 
end class 

эквивалентно следующему C#:

public class bill_staff : System.Windows.Forms.Form 
{ 

    private static bill_staff _DefaultInstance; 
    public static bill_staff DefaultInstance 
    { 
     get 
     { 
      if (_DefaultInstance == null) 
       _DefaultInstance = new bill_staff(); 

      return _DefaultInstance; 
     } 
    } 
} 

internal class testclass 
{ 
    public void testmethod() 
    { 
     bill_staff.DefaultInstance.Show(); 
    } 
} 

Это происходит только в VB для форм (классов, которые наследуют от System.Windows.Forms.Form). Лично я считаю, что это ужасная «особенность» VB - это путает различие между классом и экземпляром.

Смежные вопросы