2009-06-26 10 views
15

Tengo un objeto que tengo que ver una salida de función de muchas veces a través de la ventana de observación. El problema es que tengo que presionar el botón Actualizar cada vez que paso porque "esta expresión causa efectos secundarios y no se evaluará". ¿Hay alguna manera de etiquetar una función con algo como [DoesNotCauseSideEffects] para que el reloj pueda evaluarla automáticamente cada vez que hago un paso?Visual Studio: Hacer que el depurador sepa que una función no causa "efectos secundarios"

Estoy código C# en VS2008 o 2010.

Editar:. La función tiene este aspecto y lo hace, como se puede ver, no causa ningún efecto secundario (x, y, z son todos dobla)

public override string ToString() 
{ 
    return "{ " + x.ToString(".00") + ", " + y.ToString(".00") + ", " + z.ToString(".00") + "}"; 
} 
+0

Tal vez si incluyó los extractos de expresión y/o código, podríamos decirle por qué cree eso. –

Respuesta

3

No, esto no es posible. La determinación de si una función tendrá o no efectos secundarios la toma el evaluador de expresiones específico del lenguaje.

Tanto C# como VB.Net tienen diferentes EE y cada uno tiene su propia determinación de si una función no causa efectos secundarios. Sin embargo, en general, ambos consideran una función explícita llamada para tener efectos secundarios y no los procesará en situaciones, como paso a paso, donde el depurador desea desactivar los efectos secundarios.

La forma más fácil de evitar esto es utilizar una propiedad. Por defecto, las instancias de propiedad no se consideran con efectos secundarios y se evaluarán en el paso.

EDITAR

quería aclarar algunos conceptos erróneos. Ni el depurador ni el evaluador de expresiones harán ningún tipo de inspección de métodos para determinar si una función tiene efectos secundarios. Simplemente notan la presencia de una función y la etiquetan como potencialmente con efectos secundarios. No intentan inspeccionar el código del método de ninguna manera.

+1

Esta respuesta parece ser ** COMPLETAMENTE INCORRECTA **. Mira la respuesta a continuación; puede agregar ', ac' a la expresión de vigilancia y forzará al depurador a reevaluarla automáticamente. – Jez

+0

@Jez que funcionan no es universal. Funciona para C# pero no para VB.Net – JaredPar

+4

Razón de más para no usar VB.NET ;-) – Jez

-2

¿Ha intentado hacerlo para que la función no modifique ninguna propiedad de clase o variable global? Mi definición improvisada de "efectos secundarios" es "cambios en el entorno de ejecución que se realizan durante la ejecución de una función". Por lo que esta función hace que los efectos secundarios:

void addValues(int operand1, int operand2) { 
    globalSum = operand1 + operand2; 
} 

pero esta función no es así:

int addValues(int operand1, int operand2) { 
    return operand1 + operand2; 
} 

Es siempre mejor para evitar efectos secundarios siempre que sea posible. Pueden causar problemas en la depuración. Ver this wikipedia article.

+0

Esto no funciona. Los EE no intentan inspeccionar la función de ninguna manera, simplemente notan que no es una propiedad y la etiquetan como potencialmente con efectos secundarios. – JaredPar

19

Puede anexar ,ac a la expresión de inspección para que se actualice automáticamente el valor:

x.ToString(),ac 

Ver MSDN para obtener más información y otros format specifiers.

Cuestiones relacionadas