2009-10-07 45 views
1

我對C#作爲一種語言(來自C++背景)的合理新手而言,我目前正在編寫一個使用事件驅動API的應用程序。瞭解C#發件人對象的事件使用

主要包括註冊事件/響應處理程序和啓動事件監視器,然後處理這些異步事件/響應。

我有點麻煩理解的事情是使用sender對象。

我想使用它的目的是在提出請求(或設置監視器)時將句柄傳遞給一個類對象,並具有各種結構和數據。然後,在接收到的響應/事件被提出時,我可以將發送者對象,將其轉換回期望的類類型和訪問成員,進行進一步的更改等,以便將它視爲仍然是指向原始數據的指針(我希望這會是?)。

所以我的問題確實是,因爲我在我的請求中傳遞了一個類對象,它是實際上是一個引用,還是將它複製到值的某處,因爲它實際上只是一個通用對象,我會最終在事件上有一個空的我的類對象的副本?

還是第三種選擇,我可能完全在錯誤的軌道上,應該忘記整個事情? :)

問題是我的大腦仍處於指針模式,我認爲......

回答

6

工作,我不知道我完全理解你的問題。但要回答你的一部分:

你會得到你的對象的引用。

2

在.NET中,所有的類都是引用類型,並且引用總是被引用(引用的當前實現是一個可以在需要時由GC移動的指針),所以你不必擔心任何事情。

關於事件,發件人參數始終是生成事件的對象(例如,按鈕上的Click事件中的Button)。如果您想在自定義事件中傳遞任意數據,則從EventArgs繼承並將其作爲第二個參數傳遞。

+0

這是一件事我有點擔心,我可以看到,只要請求和響應去,我會得到我的對象引用回來。但是你說sender參數始終是生成事件的對象。這是絕對的嗎?或者它可以是別的東西(即使不推薦)。 因爲我使用的API允許我啓動一個監視器傳遞用戶對象,看起來我應該回到事件sender對象中,所以不是生成事件本身的對象。 顯然你不知道具體的實現,但是你認爲這可能嗎? – 2009-10-07 11:30:16

+0

啊沒有真正認爲我知道它是什麼,這是發件人對象返回與啓動監視器本身的響應,而不是後來的事件引發。不管怎麼說,還是要謝謝你 :) – 2009-10-07 11:34:33

11

這是一個參考。試試這個代碼,看看它是如何工作的:

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

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

如果object不是按引用傳遞,textBox1將保留您鍵入到它的任何文字。

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;       
    } 
} 
相關問題