Debug e ottimizzazione

È possibile che l'opzione /optimize, se utilizzata con il compilatore Visual C# e con il compilatore Visual Basic .NET, produca risultati imprevisti durante il debug. Se si esamina il codice nel metodo InitializeComponent in Calc.vb o Calc.cs, si noterà che appena prima del ciclo sono impostati i valori di tre variabili (x, y e z). Anche se la variabile z viene ricalcolata all'interno del ciclo, il relativo valore rimane tuttavia invariato. In effetti alla variabile z non viene più fatto riferimento, come illustrato di seguito (prima per Visual Basic):

Private Sub InitializeComponent()
   ...
   Dim j As Integer = 10
   Dim k As Integer = 20
   Dim z As Integer = 0
      
   Dim i As Integer
   For i = 0 To 9
      z = j + k
      btnNumbers(i).Size = New Size(30, 30)
      AddHandler btnNumbers(i).Click, AddressOf btnNumbersClicked
   Next i
...

quindi per Visual C#:

private void InitializeComponent() {
   ...
   int j = 10, k = 20, z = 0;
   for (int i = 0; i < 10; i++) {
      z = j+k;
      btnNumbers[i].Size = new Size(30, 30);
      btnNumbers[i].Click += new System.EventHandler(btnNumbersClicked);
   }
...

Se il programma e l'assembly del parser correlato vengono compilati con l'opzione /optimize utilizzando BuildOptimize.bat, impostando un punto di interruzione in Calc.cs in corrispondenza dell'inizializzazione delle variabili ed eseguendo il programma procedendo un'istruzione alla volta fino al punto impostato, si noterà un comportamento particolare. Anche se le istruzioni j=10 and k=20 vengono entrambe eseguite, l'istruzione z=0 viene semplicemente ignorata dal debugger, che non si arresta nemmeno durante l'esecuzione del ciclo in corrispondenza della riga z=j+k. L'effetto dell'ottimizzazione consiste nella rimozione del codice relativo alla variabile z, che non viene mai utilizzata. Nella finestra Variabili locali non è inoltre presente un nodo per la variabile z, come illustrato nella figura sottostante.

Vedere anche

Microsoft CLR Debugger | Debug di applicazioni Web ASP.NET | Appendice A: ulteriori informazioni | Appendice B: debugger di runtime (CorDbg.exe)