Передача аргумента в C # и VB.NET - PullRequest
2 голосов
/ 14 января 2012

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

Public Sub AddForm(Form Outer, Form Inner)
    Inner.FormBorderStyle = FormBorderStyle.None
    Inner.TopLevel = False;
    Inner.Dock = DockStyle.Fill
    Inner.WindowState = FormWindowState.Normal
    Outer.Controls.Add(Inner)
    Inner.BringToFront()
    Inner.Show()
End Sub

Теперь я могу использовать это в любом случае, как:

AddForm(formA, formB)

но ...

Взять тот же код в C #

public static void AddForm(Form Outer, Form Inner)
{
    Inner.FormBorderStyle = FormBorderStyle.None;
    Inner.TopLevel = false;
    Inner.Dock = DockStyle.Fill;
    Inner.WindowState = FormWindowState.Normal;
    Outer.Controls.Add(Inner);
    Inner.BringToFront();
    Inner.Show();
} 

Я не могу назвать это как:

AddForm(formA, formB);

выдает ошибку

formB является типом, но используется как переменная.

Вместо этого я должен назвать это как:

AddForm(A, new B());

Помимо этого, в VB.NET в любом классе, например formA, если я наберу formA, я смогу увидеть все объекты и элементы управления, присутствующие там, но не в C #. Опять же, я должен сделать новый экземпляр, чтобы увидеть все элементы управления. Это становится проблемой, если я хочу манипулировать двумя работающими и работающими экземплярами друг с другом. Так что же мне здесь не хватает? * 1024

(Я программист-любитель, мигрирующий с VB.NET на C #. Все идет хорошо и понятно, что я недавно понял.)

Ответы [ 3 ]

2 голосов
/ 14 января 2012

FormA и FormB - это классы в VB, экземпляры которых могут создаваться так же, как и в C #.

Однако Microsoft добавила поддержку автоматических экземпляров форм по умолчанию в VB.Net в VS2005, чтобы поддержать разработчиков, переходящих с VB classic, которые были озадачены необходимостью создавать экземпляры форм и управлять ими.

Однако это НЕ считается наилучшей практикой программирования, поскольку может привести к различным проблемам, таким как невозможность доступа к форме из фонового потока и невозможность создания нескольких экземпляров формы.

Как только вы поймете ООП и создание экземпляров классов, нет абсолютно никаких причин использовать экземпляры по умолчанию.

Фактически, вы можете отключить использование экземпляров формы по умолчанию, создав Sub New в форме, объявленной Friend (чтобы ее можно было создать в другом месте в проекте):

Friend Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

или путем изменения Public Sub New для включения параметров:

Public Sub New(SomeValue As String)

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

В любом случае любые ссылки на экземпляр формы по умолчанию приведут к следующим двум ошибкам во время компиляции, где бы то ни былоссылка на экземпляр по умолчанию:

«Form1» является типом в «WindowsApplication1» и не может использоваться в качестве выражения.

Ссылка на элемент без общего доступа требует ссылки на объект.

Сказав все это о том, как ваше текущее приложение работает в VB.Net, конкретный ответ на ваш вопрос о C # заключается в том, что вам всегда нужно создавать новые экземпляры форм в C #.

Например:

AddForm(new formA(), new formB());
0 голосов
/ 14 января 2012

Я не уверен, но я почти уверен, что VB выполняет такого рода «псевдообъектно-ориентированное программирование», где formA и formB являются объектами, а не классами. Вы не создаете объекты в VB в своей ситуации, вы просто манипулируете объектами formA и formB.

Когда вы переходите на C #, вы имеете дело с объектами и классами. Ваш класс - "formA", но это просто среда для объектов типа "formA", которые вы будете создавать как объекты. Эта статья должна объяснить это немного подробнее.

0 голосов
/ 14 января 2012

В: Я просто хочу знать, что в vb.net мы можем передать оригинальный объект как аргумент, не создавая его экземпляр

A: То, что вы ищете, называется «передача по ссылке».

Вот несколько хороших примеров:

http://www.java2s.com/Code/VB/Language-Basics/ObjectparameterpassedbyValueandbyReference.htm

Вот документация Microsoft:

http://msdn.microsoft.com/en-us/library/ddck1z30.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...