2010-03-24 37 views
1

我在努力將下面的代碼轉換爲C#。將接口的事件從VB.Net轉換爲C#

Class Class1 
    Implements IMyInterface 

    Public Event MyEvent(ByVal sender As Object, ByVal e As MyEventArgs) Implements IMyInterface.MyEvent 

    Public Sub New() 
     AddHandler Me.Slider.ValueChanged, AddressOf OnSliderValueChanged 
    End Sub 

    Private Sub OnSliderValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 
     RaiseEvent MyEvent(Me, New MyEventArgs()) 
    End Sub 

End Class 

這裏是Visual Studio的插入,當我問它來實現對我來說:

event EventHandler<MyEventArgs> IMyInterface.MyEvent 
    { 
     add { throw new NotImplementedException(); } 
     remove { throw new NotImplementedException(); } 
    } 

帶着幾分谷歌上搜索我敢肯定,我可以找出如何處理,但VS更換NotImplementedException零件仍然告訴我,這個定義還沒有實現。

回答

4

奇怪的是VS產生的添加/刪除訪問者。你不需要它們,編譯器會自動生成它們。它應該看起來像這樣:

public class Class1 : IMyInterface { 
    public event EventHandler<MyEventArgs> MyEvent; 
    public Class1() { 
     this.Slider.ValueChanged += OnSliderValueChanged; 
    } 
    private void OnSliderValueChanged(object sender, EventArgs e) { 
     var handler = MyEvent; 
     if (handler != null) { 
     handler(this, new MyEventArgs()); 
     } 
    } 
    } 

如果線程連接事件,則使用「處理程序」變量可避免空異常。

編輯:啊,這是因爲你明確實現了事件。不需要,該活動應該公開。這就是讓你陷入困境的原因,C#語法在VB.NET中的分歧

+0

你能解釋你的「處理程序」評論? – AMissico 2010-03-24 10:44:44

+0

乾杯,這樣做 – Jules 2010-03-24 11:15:02

+0

@AMissico:如果一個線程退訂了這個事件,就會有一場競賽,如果在null測試和委託調用之間發生這種情況,那麼這個程序將會炸燬程序。 – 2010-03-24 11:33:06

0

Visual Studio爲您創建的實現不是完整的實現,而是您需要完成的實現主體。在這種情況下,行「throw new NotImplementedException();」需要由您的代碼替換。

+0

我知道,這就是爲什麼我說'用一些Google搜索....「。但是,VS正在檢測出有更廣泛的問題。 – Jules 2010-03-24 10:21:52

0

使用:

http://www.developerfusion.com/tools/convert/vb-to-csharp/

我得到:

class Class1 : IMyInterface 
{ 

    public event MyEventEventHandler IMyInterface.MyEvent; 
    public delegate void MyEventEventHandler(object sender, MyEventArgs e); 

    public Class1() 
    { 
     this.Slider.ValueChanged += OnSliderValueChanged; 
    } 

    private void OnSliderValueChanged(System.Object sender, System.EventArgs e) 
    { 
     if (MyEvent != null) { 
      MyEvent(this, new MyEventArgs()); 
     } 
    } 

} 
+0

這就是我第一次嘗試,但它不能正確地轉換它。對於'公共事件'行我得到的錯誤:'一個事件的顯式接口實現必須使用事件訪問器語法' – Jules 2010-03-24 10:20:53