Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用属性访问器时引发无限循环错误#_C#_Wpf_Infinite Loop - Fatal编程技术网

C# 在C中使用属性访问器时引发无限循环错误#

C# 在C中使用属性访问器时引发无限循环错误#,c#,wpf,infinite-loop,C#,Wpf,Infinite Loop,我有第二个窗口,当搜索某个员工姓名时,该窗口将打开,该窗口提示您在两个同名员工之间进行选择。然后,窗口需要向父窗口返回一个值,以使用xml文件中的相关数据填充datatemplate 我尝试创建一个字符串,该字符串将根据单击的按钮的不同使用值进行更新,然后该字符串可以返回到第一个窗口上的调用方法,并在Linq to Xml查询中填充绑定数据 但当它运行时,会导致stackoverflow异常,并且可能是一个无限循环。我对c不太确定,不知道该改变什么 public partial class Ch

我有第二个窗口,当搜索某个员工姓名时,该窗口将打开,该窗口提示您在两个同名员工之间进行选择。然后,窗口需要向父窗口返回一个值,以使用xml文件中的相关数据填充datatemplate

我尝试创建一个字符串,该字符串将根据单击的按钮的不同使用值进行更新,然后该字符串可以返回到第一个窗口上的调用方法,并在Linq to Xml查询中填充绑定数据

但当它运行时,会导致stackoverflow异常,并且可能是一个无限循环。我对c不太确定,不知道该改变什么

public partial class Choice : Window
{
    private string StaffChoice;

    public Choice()
    {                      
        InitializeComponent();
    }
    public string staffChoice
    {
        get { return this.StaffChoice; }
        set { staffChoice = StaffChoice; }
    }

    private void btnMRG_Click(object sender, RoutedEventArgs e)
    {
        StaffChoice = "MRG";
        this.Close();
    }

    private void btnRPG_Click(object sender, RoutedEventArgs e)
    {
        StaffChoice = "RPG";
        this.Close();
    }
}
任何帮助或建议都会很好


提前谢谢

首先,您的命名约定是错误的-该字段应称为
staffChoice
,属性应称为
staffChoice
。有关更多信息,请阅读。但是,现在请仔细查看您的物业:

public string staffChoice
{
    get { return this.StaffChoice; }
    set { staffChoice = StaffChoice; }
}
你认为二传手是干什么的?它有两个问题:

  • 它会忽略您试图将其设置为的值
  • 它递归地调用自己
您可以通过保留手动声明的字段、修改命名约定并更改属性将变量设置为
value
来解决此问题,如下所示:

private string staffChoice;

public string StaffChoice
{
    get { return staffChoice; }
    set { staffChoice = value; }
}
但是,使用自动实现的属性会更简单:

public string StaffChoice { get; set; }

这将自动为您创建支持字段和getter/setter。

您的setter不正确,您正在为自身赋值(导致无限循环),而不是使用

您应该将代码更改为这样,您的命名约定向后看了一下,所以我更正了它,希望您不介意:

private string staffChoice;

public Choice()
{                      
    InitializeComponent();
}

public string StaffChoice
{
    get { return staffChoice; }
    set { staffChoice = value; }
}

private void btnMRG_Click(object sender, RoutedEventArgs e)
{
    staffChoice = "MRG";
    this.Close();
}

private void btnRPG_Click(object sender, RoutedEventArgs e)
{
    staffChoice = "RPG";
    this.Close();
}

您的财产应为:

public string staffChoice
{
    get { return this.StaffChoice; }
    set { this.StaffChoice = value; }
}
在您的代码中,您在setter中再次调用setter-因此是无限递归

但是,由于您没有在setter中执行任何特殊操作(例如通知UI属性已更改),因此您只需执行以下操作:

public string staffChoice { get; set; }
这个“自动属性”更干净一些


(顺便说一句:通常的做法是back变量以小写字母开头,public属性以大写字母开头。但是,如果您的应用程序一致,这并不重要。)

最简单的方法是声明这样的属性

public string StaffChoice { get; set; }
您的问题是您基本上是从同一个setter中调用属性setter-因此您有一个递归循环

private string StaffChoice;

public string staffChoice
{
    get { return this.StaffChoice; }
    set { StaffChoice = value; }
}

我认为接球手很好。我认为二传手错了。他使用了非标准的命名convention@32bitkid:是的,我只注意到了这一点。哎呀!嘿,谢谢你给我关于命名约定的建议!我对编码和自学真的很陌生,所以经常出错!谢谢那些调整工作,解决了递归循环。我我应该已经知道为什么这不起作用了。虽然现在我如何让代码从这个子窗口跳出并返回到主窗口代码中的调用点,在那里我可以使用这个StaffChoice字符串?嘿,更正没有问题,总体上对开发来说还是很新的,所以随我去学习吧!