Wyjasnienie przykładu z artykułu o C#

0

Czytam sobie Wasz artykuł, ten oto:
Garbage Collector

Konkretnie:

Przykład z objaśnieniem:

StringBuilder a=new StringBuilder(); //1
StringBuilder b=new StringBuilder(); //2
a=b; // 3
b=null; //4

Cóż zatem się stało? Na początku istniały 2 obiekty z referencjami do nich, a w ostateczności zmieniliśmy referencję dla obiektu 'a', a usunęliśmy dla 'b'. Cóż zatem z rzeczywistym obiektem 'a', który dalej jest na stercie? A więc: nie mamy żadnej sposobności aby odwołać się do obiektu 'a' (wszystkie referencje do niego zostały usunięte). O takim obiekcie mówi się, że jest martwy. Zajmuje tylko niepotrzebną pamięć sterty, która jest marnowana.

Postanowiłem sprawdzić na szybko, moja aplikacja konsolowa wyświetla mi "kocie" w konsoli, ponizej kod:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tescik
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new StringBuilder("hej");
            var b = new StringBuilder("kocie");
            a = b;
            b = null;

            Console.WriteLine(a);
            Console.ReadLine();

        }
    }
}

Nie rozumiem tego, wg mnie to, że wyświetla mi się "kocie" w konsoli, wynika z faktu, że do zmiennej a została przepisana zawartość zmiennej b. A z artykułu o ile dobrze to rozumiem wynika, że nie powinienem po operacji b=null mieć dostępu do obiektu a?

2

Nie, nie chodzi o samą zmienną a tylko obiekt pierwotnie przypiasany do a:

StringBuilder a=new StringBuilder(); //1
StringBuilder b=new StringBuilder(); //2
a=b; // 3
b=null; //4

Więc to co jest w artykule jest prawidłowe (choć może nieprecyzyjnie napisane) - po nadpisaniu zmiennej a obiekt, który pogrubiłem jest niedostepny (w Twoim przykładzie znaczy to, że nie dostaniesz się już w żaden sposób do obiektu z "hej").

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0