Pour résumer:
bool ageIsValid = false;
Tu déclares un booléen (une variable ayant pour valeur vrai ou faux.) Tu définis sa valeur à false (faux).
int age = -1;
Tu déclares un entier, tu mets -1 comme âge dedans. C'est une valeur arbitraire, on aurait pu mettre n'importe quoi car ce que l'utilisateur va entrer remplacera cette valeur. Mais -1 permet de voir directement que c'est un âge non valide donc c'est assez explicite.
while (!ageIsValid)
{
Tu fais une boucle qui répétera les instructions suivantes tant que son gardien sera vrai. (Donc ici, quand que ageIsValid sera faux, grâce au "!"). En gros, tu vas redemander à l'utilisateur son âge tant qu'il ne sera pas correct. On rentrera au moins une première fois dans la boucle car au début, on a dit que ageIsValid était faux, donc le gardien de boucle est vrai.
Console.WriteLine("Veuillez saisir votre age");
string saisie = Console.ReadLine();
if (int.TryParse(saisie, out age))
ageIsValid = true;
else
{
ageIsValid = false;
Console.WriteLine("L'age que vous avez saisi est incorrect ...");
}
Ici, tu demandes à l'utilisateur de taper son âge, l'entrée de l'utilisateur est convertie en un nombre entier et placée dans la variable "age". Si ça fonctionne, tu dis que ageIsValid est maintenant vrai, donc la boucle ne s'exécutera plus. Si l'entrée de l'utilisateur n'a pas pu être convertie en nombre entier, c'est que l'âge rentré n'est pas correct, tu l'affiches et tu spécifies que ageIsValid est (reste) faux.
}
Console.WriteLine("Votre âge est de : " + age);
Enfin, ce code est exécuté après la boucle, donc une fois que l'utilisateur a entré un âge valide. Tu affiches cet âge dans la console.