2012-09-20 24 views
0
Thread1.WorkerReportsProgress = true; 
Thread1.ProgressChanged += new ProgressChangedEventHandler(Function2HandleWhenProgressChanges); //When progress changes, define a function to handle it. 
Thread1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Function2HandleWhenThreadIsFinished); //The function to run when the thread is finished 
Thread1.DoWork += new DoWorkEventHandler(Thread1_DoWorkDo); //The function defining what the thread must do. 

現在,我明白ProgressChangedEventHandler是一個委託。反過來,一個代表原來是一個班級。代表和背景工人類中的事件

1.「ProgressChangedEventHandler」屬於哪個類?我沒有在我的代碼中定義任何。

2.「ProgressChanged」是一個事件嗎?如果是這樣,這屬於哪一類?

3.如果我沒有指定「新的ProgressChangedEventHandler」仍然代碼編譯?像下面的東西。

Thread1.WorkerReportsProgress = true; 
Thread1.ProgressChanged += Function2HandleWhenProgressChanges; //When progress changes, define a function to handle it. 
Thread1.RunWorkerCompleted += Function2HandleWhenThreadIsFinished; //The function to run when the thread is finished 
Thread1.DoWork += Thread1_DoWorkDo; //The function defining what the thread must do. 
+0

那麼,結果呢?編譯器從事件類型中理解,這個特定的「事件處理器」方法應該遵循該特定事件的簽名a! –

回答

1

委託了一個星期左右完全相同的問題,討論這個非常符號,反過來,真可謂是一類。

它不是一個類,它是一個類型。這就解釋了爲什麼你會問這些其他問題。把它看作是一種方法的類型描述,返回類型和參數很重要。委託類型有助於編譯器確保您分配正確的事件處理程序方法。該方法必須具有與委託類型完全相同的返回類型和參數。如果情況並非如此,編譯器會抱怨。這種類型安全在.NET中非常重要。

「ProgressChangedEventHandler」屬於哪個類?

它是一個委託類型,而不是一個類。它在.NET框架中聲明。添加對System.dll的引用並將using System.ComponentModel置於程序的頂部,可以在不使用拼寫完整類型名稱的情況下使用它。

「ProgressChanged」是一個事件嗎?

是的,它是BackgroundWorker類的事件。隨着DoWork和RunWorkerCompleted,您幾乎總是訂閱的其他兩個事件。

如果我沒有指定「新的ProgressChangedEventHandler」仍然代碼編譯?

這就是所謂的「語法糖」。 C#編譯器可以告訴事件類型需要哪種委託類型,並根據需要自動生成語句的「新ProgressChangedEventHandler」部分。很方便。然而,智能感知將永遠生成它。即使完整的語句是語法糖,你從不明確地分配Delegate.Target屬性。根據目標方法是否是靜態的,編譯器推斷它爲空或這個

+0

不好意思問這個。對類和類型的一些清晰?我用Google搜索了一下,發現沒有合適的解釋。我是C#的新手。 –

+0

只是從.NET中不*每個*類型是一個類的概念開始工作。絕大多數是。然而,一個'int'不是一個類,但它肯定是一個類型。指針類型是最極端的例子,它們甚至不從System.Object派生。正確的分組詞是'type',類是類型的一個子集。 –

+0

如果我已經清楚瞭解,那麼就像「int」我們使用「委託」,或者我可以簡單地稱他們爲「關鍵字」? –

4

1)它不屬於任何人。它是一個在.NET框架中單獨定義的類型。

2)是的。它在BackgroundWorker類中定義(可以通過按F1查看它在MSDN中或通過您在BackgroundWorker類的實例上調用它來看到)

3)它是語法糖。編譯器可以幫助您減少打字量。

谷歌搜索「events and delegates .net」會顯示很多非常好的解釋。

1

簡短的回答你的問題是:

  1. 事件處理程序的對象不屬於任何一類必然。與其他對象一樣,它們在框架內被定義爲適當的名稱空間。你可以在你定義一個類的任何地方定義一個委託,這樣你就可以把它放在一個名字空間中或嵌套在另一個類中。位置只取決於有意義的。在您的具體示例中,ProgressChangedEventHandler屬於System.ComponentModel名稱空間,並且不嵌套在另一個類中。

  2. 是的,ProgressChanged在一個事件中,它也是System.ComponentModel命名空間的一部分。

  3. 是的,這個速記工程。你比較的兩種格式通常被認爲是相同的符號,並編譯成相同的IL,所以如果你願意,可以隨意使用。其實這是一個很好SO question正如我剛纔