2010-11-09 66 views
0

我需要在對象obj中訂閱事件的事件處理方法中訪問對象obj(類型爲某些ClassA)的x和y屬性。鑄造vs參數傳遞

選項1:只需將此事件的EventHandler類型轉換爲發件人即可。

 
void handlingMethod(object sender, EventArgs e) 
{ 
    ClassA ca = sender as ClassA; 
    Dosomething(ca.id, ca.x, ca.y); 
} 

RaiseEvent(this,null); //in ClassA 

選項2: 做一個SpecialEventHandler1所以能夠避免鑄造。

 
void handlingMethod(SpecialEventArgs e) 
{ 
    Dosomething(e.id, e.x,e.y); 
} 

RaiseSpecialEvent1(new SpecialEventArgs(this.id, this.x,this.y));//in ClassA 

選項3: 做一個SpecialEventHandler2,這樣可避免產生兩種鑄造和新SpecialEventArgs對象。

​​3210

可以說這個事件持續增加@ 50 /秒。哪一個更有效?它取決於ClassA的大小嗎?我認爲Option3是性能最好的方法。請給出你的見解。

+0

什麼是語言? Java的? – jball 2010-11-09 22:23:45

+0

這個語言是C# – user441660 2010-11-09 23:54:38

回答

3

50hz一點都不快,所以你最好的選擇就是堅守慣例。這會讓你的代碼更容易被新開發者接受。另外請記住只在預期只有一種類型時使用強制轉換,這樣如果事件被錯誤地提升,您可以得到一個詳細的異常。

void MyClassA_Something(object sender, EventArgs e) 
{ 
    ClassA ca = (ClassA)sender; 
    Dosomething(ca.id, ca.x, ca.y); 
} 

事件真的不應該花太長時間,但如果他們真的需要將它卸載到另一個線程上。不管哪種情況,儘管你應該堅持事件的約定。

void MyClassA_Something(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(o => { 
     ClassA ca = (ClassA)sender; 
     Dosomething(ca.id, ca.x, ca.y); 
    }); 
} 
+0

謝謝@ChaosPandion。但500和DoSomething需要相當長的時間?你有沒有說過其他選擇更好?你能否就如何完成鑄造工作提供一些見解? – user441660 2010-11-10 00:00:20

+0

我相信鑄造是儘可能快的。如果出現性能問題,您最好努力改進DoSomething。另外,如果它是多線程的,請考慮在該行上使用鎖定。 – 2010-11-10 04:03:22