2013-08-05 15 views
22

Szukałem jakiegoś kodu w debugerze powiązanym z mechanizmem Razor View i zauważyłem, że niektóre typy pojawiają się w debugerze z końcowym znakiem kropki na końcu nazwy typu, np .:Co oznacza końcowa kropka na typie C#?

{Nancy. ViewEngines.Razor.RazorViewEngine.}

Czy ktoś wie co to oznacza? Nie jest poprawna składnia, aby użyć go podczas określania rzutowania na obiekcie, więc jestem zaintrygowany tym, co wskazuje w debugerze.

EDIT: Zgodnie z wnioskiem @Damien_The_Unbeliever, zrzut ekranu zmiennej debugger:

Debug Image

a kod że patrzę na:

public TCompiledView GetOrAdd<TCompiledView>(
      ViewLocationResult viewLocationResult, Func<ViewLocationResult, TCompiledView> valueFactory) 
     { 
      TCompiledView compiledView = default(TCompiledView); 
      compiledView = (TCompiledView)this.cache.GetOrAdd(viewLocationResult, x => valueFactory(x)); 

dać Nieco więcej, próbujemy dodać logowanie do naszej pamięci podręcznej Nancy View, aby zbadać sporadyczny problem z błędami kompilacji Razor Views, ale to nie jest tak istotne dla zadania jon.

+0

Ta biblioteka automatycznie generuje kod. System.CodeDom jest widoczny, może jakiś Reflection.Emit gdzieś i jesteś w połowie drogi do wyjaśnienia. Wystarczy zgłosić raport błędu za pomocą [projektu] (https://github.com/NancyFx/Nancy/issues). –

+0

Głupie wdrożenie 'ToString()' to moje przypuszczenie. Sprawdź go na rzeczywisty typ, który można zobaczyć w oknie zegarka. – leppie

+0

@leppie 'ToString' prawdopodobnie daje coś w stylu' 'Nancy.ViewEngines.Razor.RazorViewEngine + <> c__DisplayClass1" 'lub podobne. Jest to zagnieżdżona klasa '<> c__DisplayClass1' wewnątrz typu' RazorViewEngine' w przestrzeni nazw 'Nancy.ViewEngines.Razor'. Zamiast wywoływania 'ToString()' debugger próbuje napisać zewnętrzną klasę, po której następuje kropka (nie plus znak), po której następuje wewnętrzna nazwa klasy. Zobacz zaktualizowaną odpowiedź Damiena. –

Odpowiedz

12

Widziałem to, gdy zmienna/wartość jest faktycznie typu generowanego przez kompilator (np. Do przechowywania "zmiennych lokalnych" przechwyconych przez lambda, asynchroniczne, iteracyjne, itp.). Debugger (w różnych miejscach) nie może wyświetlić rzeczywistej nazwy klasy.


Np. Ten przykładowy program:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var p = new Program(); 
     p.DoStuff(); 
    } 

    void DoStuff() 
    { 
     int i = 19; 
     Expression<Func<int>> j =() => i + 10; 
     var k = (((j.Body as BinaryExpression).Left as MemberExpression).Expression as ConstantExpression).Value; 
     Console.ReadLine(); 
    } 
} 

Z przerwania na Console.ReadLine() znajdziesz typ na klasę za k wygląda Program. zamiast Program+<>_DisplayClass0


Dodawanie Jeppe: Ten przykład jest nieznaczne uproszczenie powyższego, unikając drzewa wyrażeń. Wygląda na instancję delegata o numerze Target, która będzie instancją wygenerowanej klasy. Dla porównania wygląda również na blok typu iteratora:

using System; 
using System.Collections.Generic; 

static class Program 
{ 
    static void Main() 
    { 
    int i = 19; // to be captured by lambda, will become field on a generated class 
    Func<int> f =() => i; 
    var target = f.Target; // when debugging type looks like "Program." 
    Console.WriteLine(target.GetType().ToString()); // writes "Program+<>c__DisplayClass1" 

    var seq = GetSeq(); // when debugging type looks like "Program.GetSeq" 
    Console.WriteLine(seq.GetType().ToString()); // writes "Program+<GetSeq>d__3" 
    } 

    static IEnumerable<int> GetSeq() // returns "state machine" (iterator block) 
    { 
    yield return 42; 
    } 
} 
+0

Więc mówisz, że nazwa jest rzeczywiście prawdziwy typ 'Nancy.ViewEngines.Razor.RazorViewEngine.STRANGE_CHARS_HERE', ale z powodu błędu, który pokazał wszystko jest' Nancy.ViewEngines.Razor.RazorViewEngine.'? –

+1

@JeppeStigNielsen - to jest to, co widziałem - np. jeśli nazwa typu to '<> displayClass1', wartość tego typu pokazuje tylko nazwę przestrzeni nazw w kolumnie typu. Oczywiście uzyskanie takich wystąpień jest trudne, a bez OP pokazującego więcej kodu nie będziemy wiedzieli, czy tak jest w tym przypadku. Niestety generowanie krótkiej wersji demo problemu jest również trudne. –

+0

Spróbuję znaleźć czas, by przejść do debuggera i zrobić zrzut ekranu z tym, co widzę, obejrzeć to miejsce ... –