我正在创建一个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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我相信当我尝试从文本文件中读取电话号码时会发生异常.以下代码来自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);
Run Code Online (Sandbox Code Playgroud)
但是,当我在该行放置一个断点并进入调试模式时,当我将鼠标悬停Phone在该行中时Phone = value;,VS在大约6秒后退出调试模式.这是我悬停Phone和VS退出调试模式后的输出:
ContactsList.vshost.exe'(Managed(v4.0.30319)):已加载'C:\ WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll',跳过加载符号.模块已经过优化,调试器选项"Just My Code"已启用.程序'[5200] ContactsList.vshost.exe:Managed(v4.0.30319)'已退出,代码为-2147023895(0x800703e9).
我尝试了很多解决方案(重新启动VS,清理和重建解决方案,启用/禁用不同的设置),但对于我的生活,我无法弄清楚问题.尝试查找退出代码0x800703e9,现在仍然知道它是什么,我所知道的是它与StackOverflowException有关.解决这个问题的任何方法?
每当您为属性赋值时,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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,你是这样的递归作业安全的,因为你在这里使用一个备份特性,所以当你分配是将它们存储在值_Phone从检索值_Phone通过get
| 归档时间: |
|
| 查看次数: |
3179 次 |
| 最近记录: |