我正在创建一个C#电话簿应用程序,它从用户输入输入(名字,姓氏和电话号码),将其存储在文本文件中,并可以在Windows窗体上显示。目前,当我启动程序时,我在此方法中得到一个StackOverflowException:
public string Phone
{
get { return Phone; }
set
{ // VS says that StackOverflowException happens here
if (value.Length == 10)
{
Phone = value;
}
else
{
Phone = "0000000000";
}
}
}
我相信当我尝试从文本文件中读取电话号码时会发生异常。以下代码来自Read方法:
foreach (var line in lines)
{
string[] entries = line.Split('`');
Contact newContact = new Contact();
newContact.FirstName = entries[0];
newContact.LastName = entries[1];
newContact.Phone = entries[2]; //I think exception happens here
contactList.Add(newContact);
但是,当我在该行放置断点并进入调试模式时,当我将鼠标悬停在Phone
行中的Phone = value;
时,VS在大约6秒后退出调试模式。这是我悬停Phone
后VS输出调试模式后的输出:
ContactsList.vshost.exe' (管理(v4.0.30319)):已加载 ' C:\ Windows \ Microsoft.Net \组件\ GAC_MSIL \ System.Configuration \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.Configuration.dll&#39 ;, 跳过加载符号。模块已优化并具有调试器选项 ' Just My Code'已启用。 该程序' [5200] ContactsList.vshost.exe:Managed(v4.0.30319)'已退出代码-2147023895(0x800703e9)。
我尝试了很多解决方案(重新启动VS,清理和重建解决方案,启用/禁用不同的设置),但对于我的生活,我无法弄清楚问题。尝试查找退出代码0x800703e9
,现在仍然知道它是什么,我所知道的是它与StackOverflowException有关。解决这个问题的方法是什么?
答案 0 :(得分:5)
每当你为属性Phone
分配一个值时,它的setter就会被触发,你在setter中再次将值赋给同一个变量,这样它就会再次触发它,然后进程就会继续。因此,您的代码将生成无限分配,使用如下所示的备份私有属性:
private string _Phone;
public string Phone
{
get { return _Phone; }
set
{ // VS says that StackOverflowException happens here
if (value.Length == 10)
{
_Phone = value;
}
else
{
_Phone = "0000000000";
}
}
}
现在您可以安全地使用此类递归分配,因为您在此处使用备份属性,因此在分配值时,您将它们存储在_Phone
中,并从_Phone
到{{1}检索值}