2

VB.NET では、元のオブジェクトをインスタンス化せずに引数として渡すことはできますか? たとえば、プロジェクト formA と formB に 2 つのフォームがあります。今、私はこのコードを持っています。

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());

これとは別に、formA のような任意のクラスの VB.NET では、formA と入力すると、そこに存在するすべてのオブジェクトとコントロールが表示されますが、C# では表示されません。繰り返しますが、すべてのコントロールを表示するには、新しいインスタンスを作成する必要があります。2 つの実行中および作業中のインスタンスを相互に操作したい場合、これは問題になります。では、ここで欠けている基本的なことは何ですか?

(私は VB.NET から C# に移行しているアマチュア プログラマーです。最近わかったことを期待して、順調に進んでいます。)

4

3 に答える 3

2

FormA と FormB は VB のクラスで、C# と同じようにインスタンス化できます。

ただし、Microsoft は、フォームのインスタンスを作成および管理する必要性に混乱していた VB クラシックから移行する開発者をサポートするために、VS2005 の VB.Net にフォームの自動デフォルト インスタンスのサポートを追加しました。

ただし、バックグラウンド スレッドからフォームにアクセスできない、フォームの複数のインスタンスを作成できないなど、さまざまな問題が発生する可能性があるため、これはプログラミングのベスト プラクティスとは見なされません。

OOP とクラスのインスタンス化を理解すれば、デフォルトのインスタンスを使用する理由はまったくありません。

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

いずれの場合も、フォームの既定のインスタンスへの参照は、既定のインスタンスが参照されている場合は常に、次の 2 つのコンパイル時エラーになります。

'Form1' は 'WindowsApplication1' の型であり、式として使用できません。

非共有メンバーへの参照には、オブジェクト参照が必要です。

現在のアプリが VB.Net でどのように動作するかについてすべて説明しましたが、C# に関する質問に対する具体的な答えは、常に C# でフォームの新しいインスタンスを作成する必要があるということです。

例えば:

AddForm(new formA(), new formB());
于 2012-01-14T19:58:11.263 に答える
0

Q: vb.net では、元のオブジェクトをインスタンス化せずに引数として渡すことができることを知りたいだけです。

A: あなたが探しているのは、「参照渡し」と呼ばれるものです。

以下にいくつかの良い例を示します。

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

マイクロソフトのドキュメントは次のとおりです。

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

于 2012-01-14T17:14:34.400 に答える
-1

確かではありませんが、VB がこの種の「疑似オブジェクト指向プログラミング」を行っていることは確かです。ここで、formA と formB はクラスではなくオブジェクトです。あなたの状況では VB でオブジェクトを作成するのではなく、オブジェクト formA と formB を操作しているだけです。

C# に移行すると、オブジェクトとクラスが処理されます。クラスは「formA」ですが、オブジェクトとしてインスタンス化するタイプ「formA」のオブジェクトの単なるフレームワークです。 この記事では、これについてもう少し説明する必要があります。

于 2012-01-14T17:15:19.270 に答える