A me l'esempio funziona così come postato.
Ora, una volta compilato, lo eseguo e in consolle mi viene fuori il saluto personalizzato(Ciao George Bush", ma, una cosa non mi è chiara, get e set che si trovano sopra, a questo punto, a cosa servono?
Servono.
codice:
            public string ForeName
            {
                get
                {
                    return foreName;
                }
                set
                {
                    if (value.Length > 20)
                        Console.WriteLine("Il valore è maggiore di 20!");
                    else
                        foreName = value;
                    
                }
            }
Quando tu imposti una proprietà, vorresti eseguire un controllo immediato sulla correttezza
di questa proprietà. Il codice su riportato ti controlla, ad esempio se un valore supera i
20 caratteri di lunghezza. Molto spesso il controllo non è banale, come ad esempio per le
date o per un qualche dato particolare. Se 'incapsuli' i controlli in questo modo, non dovrai
tutte le volte scriverli nel codice. Una proprietà di tipo data avra' i suoi controlli, una di
tipo CodiceFiscale altri ecc...
Certo qui si sta parlando di programmazione di un certo livello. Prova a leggere bene il
contesto dal libro (o dal manuale) da dove hai preso l'esempio. Perchè se fai la domanda
".... a cosa serve...." vuol dire che stai scrivendo codice senza capirlo.