W Visual Studio istnieje pewna opcja, która umożliwia sprawdzenie wartości obiektu, do którego nie ma się jawnej referencji. Spójrzmy na następujący przykład:
class Program { static void Main(string[] args) { DoSomething(); } private static void DoSomething() { var person=new Person(); person.FirstName = "Piotr"; person.LastName = "Zielinski"; } }
Jeśli ustawimy breakpoint w metodzie DoSomething naturalnie zobaczymy wartość obiektu person w oknie watch:
Jeśli jednak przejdziemy dalej, do funkcji main wtedy zmienna person będzie poza scope i watch nic nie pokaże:
Jest to naturalne zachowanie, ponieważ nie ma jawnej referencji do Person. Czasami jednak, mimo wszystko chcemy śledzić taki obiekt. Oczywiście w celu wykrycia memory leak służą profilery, ale czasami dostęp do referencji może być utrudniony a mimo to, chcemy mieć łatwy do niego dostęp. Łatwo wyobrazić sobie przykład z jakimś własnym kontenerem, gdzie nie ma publicznego dostępu do instancji. W VS można z menu podręcznego wybrać “Make Object ID”. Należy zatem kliknąć na zmiennej Person w watch i wybrać wspomnianą opcję:
Koło zmiennej wtedy pojawi się identyfikator w formie 1# :
Jest to tzw. słaba referencja. Możemy mieć do niej dostęp nawet w funkcji Main:
Wystarczy wpisać ją, jak każdą inną zmienną w oknie watch. Oczywiście, gdy GC zwolni zasoby, wtedy pojawi się NULL. Obiekt wciąż jest widziany jako nieosiągalny i nie ma to wpływu na działanie GC.
A to nie jest dostepne tylko w vs ultimate?
W wersji Premium spradzalem i jest tez ta opcja dostepna.
W VS2013 Express For Desktop też jest ta opcja.