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

时间:2012-01-19 12:11:27

标签: c# wpf infinite-loop

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

我尝试创建一个字符串,该字符串将根据单击的按钮更新值,然后可以将此字符串返回到第一个窗口上的调用方法,并在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();
    }
}

任何帮助或建议都会很棒!

提前致谢!

4 个答案:

答案 0 :(得分:3)

首先,您的命名约定是错误的 - 字段应该被称为staffChoice属性应该被称为StaffChoice。有关更多信息,请阅读.NET naming conventions。但是,现在仔细看看你的房产:

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。

答案 1 :(得分:3)

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

public string StaffChoice { get; set; }

你的问题是你基本上是在同一个setter中调用属性setter - 因此你有一个递归循环。您可以像这样更改代码以使其正常工作......

private string StaffChoice;

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

答案 2 :(得分:2)

您的setter不正确,您正在为自己分配一个值(导致无限循环)而不使用value

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

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();
}

答案 3 :(得分:2)

您的财产应该是:

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

在你的代码中,你在setter中再次调用setter - 因此无限递归。

但是,由于你没有在setter中做任何特别的事情(比如通知UI该属性已经改变了,你可以简单地:

public string staffChoice { get; set; }

这个“自动财产”有点清洁。

(顺便说一句:通常的做法是让后面的变量以小写字母开头,公共属性以大写字母开头。但是,如果你在应用程序中保持一致并不重要。)< / p>

相关问题