Udostępnij za pośrednictwem


Wyrażenia w C# i F#

Zarządzany ewaluator wyrażeń akceptuje większość wyrażeń napisanych w języku C#.

Zarządzany ewaluator wyrażeń nie rozpoznaje jednak wyrażeń F#.Jeśli użytkownik debuguje F#, musi przetłumaczyć wyrażenia na składnię języka C# przed wprowadzeniem wyrażeń do okna debugowania lub okna dialogowego.Podczas tłumaczenia wyrażenia z F# na C#, należy pamiętać, że C# używa operatora == do testowania równości, podczas gdy F# używa pojedynczego =.

Poniższe sekcje oferują szczegółowe informacje i omawiają niektóre typy wyrażeń, które nie są obsługiwane lub są częściowo obsługiwane:

  • Rzutowania

  • Obiekty dynamiczne

  • Identyfikatory i typy

  • Metody szacowania

  • Operatory

  • Operatory przeciążone

  • Oszacowywanie właściwości

  • Ciągi

  • Operatory typeof i sizeof

  • WebMethods

  • Ewaluator wyrażeń ignoruje modyfikatory dostępu public, protected, internal i private .Na przykład można wywołać metodę private w oknie Czujka.Ponieważ ewaluator wyrażeń ignoruje modyfikatory dostępu, możliwe jest nieoczekiwane obciążenie może być wywołane.

Ewaluator wyrażeń wykonuje wszystkie oszacowania w niejawnym niebezpiecznym kontekście, niezależnie czy wykonywany kod jest bezpieczny lub niebezpieczny.

Ewaluator wyrażeń ignoruje także zaznaczone bloki i opcję kompilatora /checked.Wszystkie wyrażenia są oszacowane w kontekście odznaczonym.

Można dostosować wyświetlanie niestandardowych typów danych przy użyciu atrybutów.Aby uzyskać więcej informacji, zobacz Wyświetlanie niestandardowych typów danych.

Rzutowania

Proste wyrażenia rzutowania działają w debugerze:

(A)x

Rzutowania, które dotyczą wskaźników nie działają w debugerze.

Obiekty dynamiczne

Ewaluator wyrażeń może oszacować zmienne, które są statycznie typami dynamicznymi.Może to służyć do oszacowania obiektów implementujących interfejs IDynamicObject.Kiedy obiekty implementujące interfejs IDynamicObject są wykonywane w oknie Czujka, węzeł Widok dynamiczny jest dodawany.Węzeł Widok dynamiczny pokazuje elementy członkowskie obiektu dynamicznego, ale nie zezwala na edytowanie wartości elementów członkowskich.

Następujące funkcje obiektów dynamicznych nie są obsługiwane:

  • Złożone operatory +=, -=, %=, /= i *=

  • Wiele rzutowań, w tym rzutowania liczbowe i rzutowania z argumentem typu

  • Wywołania metod z więcej niż dwoma argumentami

  • Metody pobierające właściwości z więcej niż dwoma argumentami

  • Metody ustawiające właściwości z argumentami

  • Przypisywanie do indeksatora

  • Operatory logiczne && i ||

Identyfikatory i typy

Wyrażenia debugowania mogą używać dowolnych identyfikatorów widocznych w aktualnym zakresie.Na przykład jeśli debuger zostanie zatrzymany w metodzie Magh, można użyć dowolnego identyfikatora widocznego w obrębie Magh, w tym stałych, nazwy zmiennych i nazw metod.

Debuger może poprawnie wyświetlić dowolną zmienną pierwotną, wyliczenie lub typ wewnętrzny.W przypadku zmiennych typu klasy, debuger poprawnie wyświetla wartości na podstawie typu najbliżej pochodnego.Jeśli obiekt leo typu Lion, pochodzi od typu Cat, można oszacować leo.Claws i uzyskać poprawną wartość dla obiektu typu Lion.

Nowa wartość może być przypisana do dowolnego wyrażenia po lewej stronie, które jest typu wyrażenia po lewej stronie.Obejmuje to wartość pierwotną, klasę i typy System.Object.

Metody szacowania

Debuger obsługuje szacowanie metod, w tym metody przeciążane.W związku z tym można wpisać jedno z następujących wyrażeń, a debuger będzie wywoływać poprawną wersję przeciążonej metody:

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

Oszacowanie metody w debugerze wywołuje i wykonuje rzeczywisty kod dla tej metody.Jeśli metoda ma skutki uboczne, oszacowanie metody w oknie Debuger zmieni stan programu i może dać nieoczekiwane wyniki.

Po ustawieniu punktu przerwania na metodzie przeciążonej, lokalizacja punktu przerwania zależy od sposobu określenia metody.Jeśli pełny podpis zostanie określony (nazwa metody i pełna lista argumentów), debuger ustawi jeden punkt przerwania na określonym przeciążeniu.Jeśli tylko nazwa metody zostanie określona, zachowanie debugera zależy od ustawienia opcji Visual Studio.Jeśli pole wyboru Wykorzystanie IntelliSense do zweryfikowania nazwy funkcji nie jest zaznaczone, debuger ustawi jeden punkt przerwania na każdym przeciążeniu nazwy tej metody.W przeciwnym przypadku okno dialogowe Wybierz punkt przerwania zostanie otwarte, umożliwiając określenie, w którym przeciążeniu/przeciążeniach umieścić punkt przerwania.Aby uzyskać więcej informacji, zobacz Punkty przerwania: korzystanie z liczby trafień, funkcje stosu wywołań oraz warunki przerywania w wybranym miejscu i czasie w debugerze Visual Studio.

Tworzenie nowych metod anonimowych nie jest obsługiwane w debugerze w tej wersji programu Visual Studio.

Operatory

Debuger poprawnie oszacowuje większość wbudowanych operatorów, w tym:

  • Operatory relacyjne i porównania: ( expr1> expr2, expr1< expr2, expr1<= expr2, expr1=> expr2, expr1== expr2, expr1!= expr2).

  • Operatory logiczne: (expr1&& expr2, expr1|| expr2, expr1? expr2: expr3).

  • Operatory arytmetyczne: (expr1+ expr2,expr1- expr2, expr1* expr2, expr1/ expr2, expr1% expr2 ).

  • Operatory logiczne: (expr1& expr2, expr1^ expr2, expr1| expr2 ).

  • Operatory przesunięcia: (expr1>> expr2, expr1<< expr2 ).

  • Operatory przypisania: ( lvalue= expr2,lvalue*= expr2,lvalue/= expr2, lvalue%= expr2, lvalue+= expr2, lvalue-= expr2, lvalue<<= expr2, lvalue>>= expr2, lvalue&= expr2, lvalue^= expr2, lvalue|= expr2).

  • Operatory jednoargumentowe: ( +expr1, - expr1, expr1++, ++expr1, expr1--, --expr1).

Operatory przeciążone

Większość przeciążonych operatorów działa w debugerze.

Przeciążone operatory dwuargumentowe +, -, /, % i & działają:

  • expr1+ expr2

  • expr1- expr2

  • expr1/ expr2

  • expr1% expr2

  • expr1& expr2

Przeciążone operatory dwuargumentowe =, &&, & i || nie działają:

  • expr1= expr2

  • expr1&& expr2

  • expr1& expr2

  • expr1|| expr2

Przeciążone operatory dwuargumentowe << i >> nie działają jeśli oba operandy są zmiennymi typu klasy:

  • object1 <<object2

  • object1>> object2

Przeciążone operatory prefiksowe +, -, ++, --, ! i ~ działają:

  • +expr1

  • -expr1

  • ++expr1

  • --expr1

  • !expr1

  • ~expr1

Przeciążone operatory przyrostkowe ++ i -- działają:

  • expr1++

  • expr1--

Przeciążone indeksatory działają:

  • expr1[expr2]

Oszacowywanie właściwości

Debuger może oszacować właściwości w dowolnym oknie zmiennej.Jednak oszacowanie właściwości w debugerze może mieć skutki uboczne, które stwarzają niechciane i nieoczekiwane wyniki.Aby chronić się przed skutkami ubocznymi powodowanymi przez przypadkowe oszacowanie, można wyłączyć oszacowanie właściwości w oknie dialogowym Opcje.

Ciągi

Debuger rozpoznaje indeksowane operatory, gdy jest używany z ciągami, a także tablice.Tak więc na przykład, można wprowadzić:

"hello world"[0]

W oknie Czujka zostaną wyświetlone poprawne wartości:

'h'

W języku C#, w przeciwieństwie do natywnego C/C++ można edytować wartość ciągu w debugerze.Ponadto można użyć operatora Length na ciągu:

mystring.Length 

-lub-

"hello world".Length

W języku C# można łączyć ciągi ze sobą:

"hello" + "world"

Operatory typeof i sizeof

Debuger obsługuje operatory typeof i sizeof przez przekształcenie na odpowiednik funkcji .NET Framework.

typeof ( expression)

jest przekształcane na:

System.Type.GetType( expression)

Debuger następnie oblicza to przekształcone wyrażenie.

Debuger obsługuje operator sizeof.

WebMethods

Nie można wywoływać WebMethods z debugera systemu Windows.

Zobacz też

Inne zasoby

Wyrażenia w debugerze

Odwołanie w C#