2013-03-01 17 views

Odpowiedz

3

Czy wbudowane funkcje nie są bezpośrednio zintegrowane z kodem wywołującym? Jeśli tak nie jest, żadna rzeczywista metoda nie jest wywoływana, ponieważ kod jest "podkreślony" i dla każdego miejsca, w którym są używane, istnieje nowa kopia zainicjowanego kodu.

+0

To prawdopodobnie poprawne. Miałem nadzieję uzyskać odpowiedź w stylu: istnieje przełącznik kompilatora F #, który może globalnie dezaktywować wszystkie funkcje inline. Ale myślę, że nic takiego nie istnieje ... –

+0

Ustawienia dla f # są [tutaj] (http://msdn.microsoft.com/en-us/library/dd233171.aspx) nie widzą niczego odpowiedniego. Kiedy mówisz, że nie jest to pokazane jako pokazane jako odkryte, ponieważ PDB prawdopodobnie nie będzie mieć punktów sekwencji dla tych linii, więc nie powinno ich oznaczać - może to być problem z renderowaniem. Czy próbowałeś alternatywnego narzędzia, jak [OpenCover] (https://github.com/sawilde/opencover) i sprawdź, czy daje takie same wyniki. –

+0

Po niewielkiej walce osiągnąłem wyniki z OpenCover, a wyniki są takie same. Funkcje inline nie są objęte. EDYCJA: Możesz zobaczyć wyniki otwartej okładki tutaj: https://dl.dropbox.com/u/4571/opencover/index.htm –

4

Podczas pisania funkcji inline kompilator umieszcza treść tej funkcji w kodzie wywołującym. Jak to omówiono w komentarzach, nie przekazuje również informacji o debugowaniu dla tego obiektu tekstowego (i dlatego nie można przejść do funkcji - myślę, że można to naprawić - przesłać żądanie do fsbugs pod adresem microsoft dot com).

Jednak kompilator generuje również dynamiczną wersję kodu - jeśli piszesz powiedzieć:

let inline add a b = a + b 

potem jest rzeczywiście metoda w skompilowanego kodu add. Metoda będzie ogólna ('a -> 'b -> 'c) i używa dynamicznego wyszukiwania, aby znaleźć odpowiednią implementację operatora + (ponieważ generics .NET nie może reprezentować takich ograniczeń).

dynamicznej realizacji zostanie wywołany podczas korzystania odbicie lub cytaty:

open Microsoft.FSharp.Linq.RuntimeHelpers 
<@ add 1 2 @> |> LeafExpressionConverter.EvaluateQuotation |> printfn "Got: %A" 

Jeśli umieścisz punkt przerwania wewnątrz add i uruchomić powyższy kod niż przerwania zostanie trafiony (i zakładam narzędzie pokrycia kod zgłosić funkcję jako objętą).

Należy jednak pamiętać, że jest to nie kod, który jest faktycznie wykonywane, gdy piszesz add 1 2 w normalnym kodu - kod wykonujący tutaj jest inna realizacja (który używa powolne wyszukiwanie dynamiczne, zamiast inline).

+0

Po prostu próbowałem to na funkcji inline z dobrze znanym narzędziem zasięgu kodu i nie działa. Test z <@ @> przebiegał poprawnie, ale bez podświetlonego kodu. Niezły pomysł, będzie musiał pamiętać. –

+0

Podejście Tomasa polegające na dodaniu testu do metody inline za pomocą oferty można łatwo wykonać za pomocą Swensen.Unquote. Zasięg pokazuje się w OpenCover i NCrunch. – marklam