Ошибка бесконечного цикла, возникающая при использовании средств доступа к свойствам в C # - PullRequest
0 голосов
/ 19 января 2012

У меня есть второе окно, которое открывается при поиске определенного имени сотрудника, в этом окне предлагается выбрать между двумя сотрудниками с одинаковыми именами.Затем окну необходимо вернуть значение в родительское окно, чтобы заполнить табличку данных соответствующими данными из 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 ]

3 голосов
/ 19 января 2012

Самый простой способ - объявить свойство, подобное этому ...

public string StaffChoice { get; set; }

Ваша проблема в том, что вы в основном вызываете установщик свойств из одного и того же установщика - таким образом, у вас есть рекурсивный цикл. Вы можете изменить свой код следующим образом, чтобы он работал ...

private string StaffChoice;

public string staffChoice
{
    get { return this.StaffChoice; }
    set { StaffChoice = value; }
}
3 голосов
/ 19 января 2012

Во-первых, ваши соглашения об именах неверны - поле должно называться staffChoice, а свойство должно называться StaffChoice. Пожалуйста, прочитайте .NET именования для получения дополнительной информации. Однако, теперь внимательно посмотрите на вашу собственность:

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

Это автоматически создаст для вас поле поддержки и метод получения / установки.

2 голосов
/ 19 января 2012

Ваше свойство должно быть:

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

В вашем коде вы снова вызываете сеттер в сеттере - отсюда бесконечная рекурсия.

Однако, поскольку вы не делаете ничего особенногов установщике (например, уведомление пользовательского интерфейса о том, что свойство изменилось, вы могли бы просто иметь:

public string staffChoice { get; set; }

Это «свойство auto» немного чище.

(Кстати, обычная практикаиметь переменную back, начинающуюся с буквы нижнего регистра, и открытое свойство, начинающееся с буквы верхнего регистра. Однако, если вы последовательны в своем приложении, это не имеет значения.)

2 голосов
/ 19 января 2012

Ваш установщик не прав, вы присваиваете себе значение (вызывая бесконечный цикл) и не используете 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();
}
...