Condividi tramite


Espressioni in C# e F#

L'analizzatore di espressioni gestite accetta la maggior parte delle espressioni scritte in C#.

L'analizzatore di espressioni gestito non riconosce le espressioni F #, tuttavia. Se si esegue il debug di F#, è necessario tradurre le espressioni nella sintassi C# prima di immettere le espressioni una finestra di dialogo del debugger o in una finestra. Quando si traducono espressioni da F# a C#, assicurarsi di ricordare che C# utilizzi l'operatore == operatore per verificare l'uguaglianza, mentre F# utilizza il singolo =.

Nelle sezioni riportate di seguito vengono fornite informazioni specifiche e vengono illustrati alcuni tipi di espressioni non supportati o parzialmente supportati:

  • Cast

  • Oggetti dinamici

  • Identificatori e tipi

  • Valutazione dei metodi

  • Operatori

  • Operatori di overload

  • Valutazione delle proprietà

  • Stringhe

  • Operatori typeof e sizeof

  • WebMethod

  • L'analizzatore di espressioni ignora public, protected, internal e i modificatori di accesso private . È ad esempio possibile chiamare un metodo private dalla finestra Espressioni di controllo. Poiché l'analizzatore di espressioni ignora i modificatori di accesso, è possibile che venga richiamato un carico imprevisto.

L'analizzatore di espressioni esegue tutte le valutazioni in un contesto unsafe implicito, indipendentemente dal fatto che il codice eseguito sia di tipo safe o unsafe.

L'analizzatore di espressioni ignora inoltre i blocchi checked e l'opzione del compilatore /checked. Tutte le espressioni vengono valutate in un contesto unchecked.

È possibile personalizzare la visualizzazione di tipi di dati personalizzati tramite l'utilizzo di attributi. Per ulteriori informazioni, vedere Visualizzazione di tipi di dati personalizzati.

Cast

Nel debugger possono essere utilizzate espressioni cast semplici:

(A)x

I cast che implicano l'utilizzo di puntatori non funzionano nel debugger.

Oggetti dinamici

L'analizzatore di espressioni può valutare variabili che sono digitate staticamente come dinamiche. Può valutare anche oggetti che implementano l'interfaccia IDynamicObject. Quando gli oggetti che implementano l'interfaccia IDynamicObject vengono valutati nella finestra Espressioni di controllo, viene aggiunto un nodo Visualizzazione dinamica. Il nodo di visualizzazione dinamica mostra i membri dell'oggetto ma non consente la modifica dei valori dei membri.

Le seguenti funzionalità di oggetti dinamici non sono supportate:

  • Gli operatori composti +=, -=, %=, /= e *=

  • Molti cast, inclusi cast numerici e cast dell'argomento di tipo

  • Chiamate al metodo con più di due argomenti

  • I metodi per il richiamo delle proprietà con più di due argomenti

  • I metodi per il richiamo delle proprietà con gli argomenti

  • Assegnazione a un indicizzatore

  • Operatori booleani && e ||.

Identificatori e tipi

Nelle espressioni del debugger è possibile utilizzare qualsiasi identificatore visibile nell'ambito corrente. Se, ad esempio, il debugger viene arrestato nel metodo Magh, è possibile utilizzare qualsiasi identificatore visibile all'interno di Magh, tra cui costanti, nomi di variabili e nomi di metodi.

Nel debugger è possibile visualizzare correttamente qualsiasi variabile di tipo primitivo, enum o intrinseco. Nel caso di variabili di tipo classe, il valore viene visualizzato correttamente in base al tipo derivato di livello più basso. Se si dispone di un oggetto leo di tipo Lion derivato dal tipo Cat, è possibile valutare leo.Claws e ottenere il valore corretto per un oggetto di tipo Lion.

È possibile assegnare un nuovo valore a qualsiasi espressione nella parte sinistra che è un l-value, inclusi i tipi primitivo, classe e System.Object.

Valutazione dei metodi

Il debugger supporta la valutazione dei metodi, tra cui quelli di overload. Di conseguenza, quando si immette una delle espressioni seguenti, il debugger chiama la versione corretta dei metodi di overload:

Time.Set();
Time.Set(atime);

La valutazione di un metodo nel debugger comporta la chiamata e l'esecuzione del codice relativo a tale metodo. Se il metodo genera effetti collaterali, la valutazione del metodo in una finestra del debugger comporterà la modifica dello stato del programma e questa operazione può produrre risultati imprevisti.

Quando si imposta un punto di interruzione su un metodo di overload, la posizione del punto di interruzione dipende dal modo in cui si specifica il metodo. Se si specifica la firma completa, ossia il nome del metodo e l'elenco completo degli argomenti, verrà impostato un punto di interruzione sull'overload specificato. Se si specifica solo il nome del metodo, il comportamento del debugger dipenderà da un'impostazione delle opzioni di Visual Studio. Se la casella di controllo Usa IntelliSense per verificare il nome della funzione è deselezionata, il debugger imposterà un punto di interruzione su ogni overload di tale nome. In caso contrario, verrà visualizzata la finestra di dialogo Seleziona punti di interruzione nella quale è possibile specificare gli overload su cui si desidera inserire il punto di interruzione. Per ulteriori informazioni, vedere Punti di interruzione: utilizzare passaggi, funzioni sullo stack di chiamate e condizioni per interrompere nel punto e nel momento desiderati il debugger di Visual Studio.

La creazione di nuovi metodi anonimi non è supportata nel debugger di questa versione di Visual Studio.

Operatori

Nel debugger viene eseguita correttamente la valutazione della maggior parte degli operatori incorporati, tra cui:

  • Operatori di Relazione e Uguaglianza: ( expr1> expr2, expr1< expr2, expr1<= expr2, expr1=> expr2, expr1== expr2, expr1!= expr2).

  • Operatori booleani: (expr1&& expr2, expr1|| expr2, expr1? expr2: expr3).

  • Operatori aritmetici: (expr1+ expr2,expr1- expr2, expr1* expr2, expr1/ expr2, expr1% expr2 ).

  • Operatori logici: (expr1& expr2, expr1^ expr2, expr1| expr2 ).

  • Operatori di scorrimento: (expr1>> expr2, expr1<< expr2 ).

  • Operatori di assegnazione: ( lvalue= expr2,lvalue*= expr2,lvalue/= expr2, lvalue%= expr2, lvalue+= expr2, lvalue-= expr2, lvalue<<= expr2, lvalue>>= expr2, lvalue&= expr2, lvalue^= expr2, lvalue|= expr2).

  • Operatori unari: ( +expr1, - expr1, expr1++, ++expr1, expr1--, --expr1).

Operatori di overload

Nel debugger è possibile utilizzare la maggior parte degli operatori di overload.

Gli operatori infissi di overload +, -, /, %, e & sono supportati:

  • expr1 + expr2

  • expr1 - expr2

  • expr1 / expr2

  • expr1 % expr2

  • expr1 & expr2

Gli operatori infissi di overload =, &&, &, e ||, non sono supportati:

  • expr1 = expr2

  • expr1 && expr2

  • expr1 & expr2

  • expr1 || expr2

Gli operatori infissi di overload << e >> non sono supportati se entrambi gli operandi sono variabili di classe:

  • object1 <<object2

  • object1 >> object2

Gli operatori prefissi di overload +, -, ++, --, ! e ~ sono supportati:

  • + expr1

  • - expr1

  • ++ expr1

  • -- expr1

  • ! expr1

  • ~ expr1

Gli operatori suffissi di overload ++ e -- sono supportati:

  • expr1 ++

  • expr1 --

Gli indicizzatori di overload sono supportati:

  • expr1 [ expr2 ]

Valutazione delle proprietà

Il debugger è in grado di valutare le proprietà in qualsiasi finestra di variabile. La valutazione di una proprietà nel debugger può tuttavia produrre effetti collaterali che generano risultati imprevisti e indesiderati. Per evitare gli effetti collaterali causati da una valutazione accidentale, è possibile disattivare la valutazione delle proprietà nella finestra di dialogo Opzioni.

Stringhe

Quando utilizzato con stringhe e matrici, l'operatore di indice viene riconosciuto. È ad esempio possibile digitare:

"hello world"[0]

Nella finestra Espressioni di controllo verrà visualizzato il valore corretto:

'h'

A differenza di quanto avviene nel linguaggio C/C++ nativo, in C# è possibile modificare il valore di una stringa nel debugger. Inoltre, è possibile utilizzare l'operatore Length su una stringa:

mystring.Length 

In alternativa

"hello world".Length

In C# è possibile concatenare stringhe:

"hello" + "world"

Operatori typeof e sizeof

Il debugger supporta gli operatori typeof e sizeof, che vengono trasformati nella funzione .NET Framework equivalente.

typeof ( expression )

viene trasformato in:

System.Type.GetType( expression )

Viene quindi valutata l'espressione trasformata.

Il debugger supporta l'operatore sizeof.

WebMethod

Non è possibile chiamare WebMethod dalle finestre del debugger.

Vedere anche

Altre risorse

Espressioni nel debugger

Riferimenti per C#