6

私は言語として C# をかなり初めて使用し (C++ のバックグラウンドから来ました)、現在、イベント駆動型 API を利用するアプリケーションを作成中です。

これは主に、イベント/応答ハンドラーを登録し、イベント モニターを開始してから、これらの非同期イベント/応答を処理することで構成されます。

私が理解するのに少し苦労しているのは、送信者オブジェクトの使用です。

私がそれを使用したいのは、要求を行う (またはモニターを設定する) ときに、さまざまな構造とデータを含むクラス オブジェクトにハンドルを渡すことです。そして、受信された応答/発生したイベントで、送信者オブジェクトを取得し、それを予想されるクラス型にキャストしてメンバーにアクセスし、さらに変更を加えるなどして、元のデータへのポインターであるかのように扱います。 (私はそれがそうであることを望んでいますか?)。

したがって、私の質問は、リクエストでクラスオブジェクトを渡しているので、これは実質的に参照になるのでしょうか、それとも実際には単なる汎用オブジェクトであるため、行のどこかに値によってコピーされるのでしょうか。イベントでのクラス オブジェクトの空のコピー?

または、ここで完全に間違った方向に進んでいる可能性があり、すべてを忘れる必要があるという3番目のオプションはありますか? :)

問題は、私の脳がまだポインター モードで動作していることだと思います...

4

5 に答える 5

16

参考です。このコードを試して、どのように機能するかを確認してください。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    Whatever(sender);
}

private void Whatever(object sender)
{
    TextBox tb = (TextBox)sender;
    tb.Text = "yo";
}

object参照によって渡されなかった場合は、textBox1入力したテキストが保持されます。

于 2009-10-07T11:00:00.883 に答える
7

あなたの質問を完全に理解しているかどうかわかりません。しかし、あなたに部分的に答えるために:

オブジェクトへの参照を取得します。

于 2009-10-07T10:54:17.353 に答える
2

.NET では、すべてのクラスが参照型であり、参照は常に参照によって渡されます (参照の現在の実装は、必要に応じて GC によって移動できるポインターです)。何も心配する必要はありません。

イベントについては、sender パラメータは常にイベントを生成したオブジェクトです (たとえば、ボタンButtonのイベント内)。Clickカスタム イベントで任意のデータを渡したい場合は、EventArgs を継承して 2 番目の引数として渡します。

于 2009-10-07T10:56:53.087 に答える
1

パラメータが参照によって渡される場合、

1.参照インスタンス内に存在するプロパティは、元の参照インスタンスに影響を与えることなく変更できます。

2.元の参照はrefキーワードを使用して変更できます。

以下は例です

public partial class ParentForm : Form
{
    public ParentForm()
    {
        InitializeComponent();
        ChildForm childForm = new ChildForm();
        ChangeCaption( childForm );
        //Will display the dialog with the changed caption.
        childForm.ShowDialog();
        ChangeCaption( ref childForm );
        //Will give error as it is null
        childForm.ShowDialog();
    }

    void ChangeCaption( ChildForm formParam )
    {
        // This will change openForm’s display text
        formParam.Text = "From name has now been changed";
        // No effect on openForm
        formParam = null;                        
    }


    void ChangeCaption( ref ChildForm formParam )
    {
        // This will change openForm’s display text
        formParam.Text = "From name has now been changed";
        // This will destroy the openForm variable!
        formParam = null;                        
    }
}
于 2012-01-06T06:14:00.320 に答える