Ответ 1
Это потому, что вы рекурсивно называете свойство - в set
вы снова устанавливаете свойство, которое продолжается до бесконечности до тех пор, пока вы не сожжете стек.
Для хранения значения требуется частное поле поддержки, например
private string firstName;
public string FirstName
{
get
{
return this.firstName;
}
set
{
this.firstName = value;
}
}
В качестве альтернативы, если вы используете С# 3.0, вы можете использовать свойство auto-property, которое создает для вас скрытое поле поддержки, например
public string FirstName { get; set; }