Compartir a través de


Depuración y optimización

El modificador /optimize puede producir resultados distintos cuando se utiliza con los compiladores de Visual C# y de Visual Basic .NET al depurar. Si se examina el código del método InitializeComponent de Calc.vb o Calc.cs, se observará (justo antes del bucle) que se establecen valores para tres variables (x, y, z). También se puede observar que aunque z se vuelve a calcular en el bucle, su valor nunca cambia. De hecho, nunca se vuelve a hacer referencia a z, tal como se muestra a continuación (primero en 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
...

y después en 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);
   }
...

Si se compila este programa (y el ensamblado Parser relacionado) con el modificador /optimize (mediante BuildOptimize.bat), se establece un punto de interrupción en Calc.cs en el lugar donde se inicializan las variables y se recorre el programa desde ese punto, se observará algo interesante. Primero, aunque se ejecutan las instrucciones j=10 y k=20, el depurador pasa por alto z=0. A continuación, al ejecutar el bucle, el depurador no se detiene en la línea z=j+k. El efecto de la optimización es quitar el código relacionado con la variable z, que nunca se utiliza. También hay que tener en cuenta que la ventana Locales no contiene un nodo para la variable z, como se muestra en la ilustración siguiente.

Vea también

Microsoft CLR Debugger | Depurar aplicaciones Web de ASP.NET | Apéndice A: Para obtener más información | Apéndice B: Depurador en tiempo de ejecución (CorDbg.exe)