2012-06-20 14 views
0

,當我有這樣的代碼在我的應用程序的RaiseEvent調試和不斷變化的實施步驟

If _oCurrentCall.CustomData.Length > 0 AndAlso UsageType = UsageTypeEnum.Vanlig Then 
    RaiseEvent NewIncomingCallWithCustomData(_oCurrentCall) 
ElseIf UsageType = UsageTypeEnum.Sentralbord Then 
    RaiseEvent NewIncomingCall(_oCurrentCall, Queues) 
End If 

沒有調試事件被觸發就好了工作。 但是,在調試並嘗試更改執行步驟(如將執行步驟拖到其他條件塊中的raise事件)時,事件不會觸發。

我在做什麼錯?

+0

你在編譯版本嗎? –

+0

嗨阿德里亞諾。我正在編譯調試模式 – Martin

回答

2

我重播。這可以說是調試器中的一個錯誤,看起來很難解決我的問題。將代碼從vb.net反編譯到C#時更容易看到。此示例代碼:

Class Test 
    Public Event Foo As EventHandler 
    Public Event Bar As EventHandler 

    Public Sub Run(ByVal arg As Integer) 
     If arg = 0 Then 
      RaiseEvent Foo(Me, EventArgs.Empty) 
     Else 
      RaiseEvent Bar(Me, EventArgs.Empty) 
     End If 
    End Sub 
End Class 

被轉換到這種等價的C#代碼:

public void Run(int arg) 
{ 
    EventHandler VB$t_ref$S0; 
    if (arg == 0) 
    { 
     VB$t_ref$S0 = this.FooEvent; 
     if (VB$t_ref$S0 != null) 
     { 
      VB$t_ref$S0(this, EventArgs.Empty); 
     } 
    } 
    else 
    { 
     VB$t_ref$S0 = this.BarEvent; 
     if (VB$t_ref$S0 != null)    // <=== HERE!!! 
     { 
      VB$t_ref$S0(this, EventArgs.Empty); 
     } 
    } 
} 

當您使用設置下一語句調試命令來設置執行點到第二RaiseEvent語句,調試器移動執行指向上面代碼片段中由HERE標記的語句。繞過臨時變量的初始化。這仍然是空的,所以事件不會被提出。您可以通過使用該命令後使用Debug + Windows + Disassembly查看機器代碼來觀察這種情況。

這在其他方面完全一樣的那種情況下提高代碼的任何C#程序員非常熟悉,他們沒有加薪事件訪問所以必須這樣寫:

var temp = Bar; 
if (temp != null) { 
    Bar(this, EventArgs.Empty); 
} 

好,調試摸索這很容易看出它會如何發生。以及它如何可能長久未被發現(或忽略)。變通辦法很難得到,RaiseEvent聲明之前的一個聲明會起作用,但是非常不切實際。修改變量以便If語句執行所需的事件是可能的。

我在connect.microsoft.com報告了該問題,反饋文章is here。不要期待奇蹟。

+0

哇,謝謝漢斯。你是說bug在c#語法中不存在? – Martin

+0

對,在C#中設置斷點沒有問題,因爲代碼中有語句。上面代碼片段中的'var temp = Bar;'語句。 –