如何访问子例程之外的对象?

时间:2016-10-19 21:12:31

标签: c# winforms

我正在学校学习IT,我们必须建立一个比较2个字符的基本程序,告诉用户哪个更好。

我在winform中使用基本GUI,使用列表框选择要比较的字符。

但是,我需要在if语句中调用selectedCharacter对象,以便比较总数。

public void lstbxCharacter1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Character selectedCharacter = characters.ElementAt(lstbxCharacter1.SelectedIndex);

        lblName1.Text = "Name: " + selectedCharacter.getName();
        lblNinjutsu1.Text = "Ninjutsu: " + selectedCharacter.getNinjutsu();
        lblGenjutsu1.Text = "Genjutsu: " + selectedCharacter.getGenjutsu();
        lblTaijutsu1.Text = "Taijutsu: " + selectedCharacter.getTaijutsu();
        lblIntellegence1.Text = "Intellegence: " + selectedCharacter.getIntellegence();
        lblStrength1.Text = "Strength: " + selectedCharacter.getStrength();
        lblSpeed1.Text = "Speed: " + selectedCharacter.getSpeed();
        lblStamina1.Text = "Stamina: " + selectedCharacter.getStamina();
        lblHandSigns1.Text = "Hand Signs:" + selectedCharacter.getHandSigns();
        lblTotalValue1.Text = selectedCharacter.getTotal().ToString();
        pb1.Image = Image.FromFile(selectedCharacter.getImage());


    }

^这是我的子程序,通过从列表框中选择名称来更改字符(只需忽略所有“获取”方法)

public void displayWinner()
    {
        if ()
        {
            lblWinner.Text = "Character 1 is better";
        }
        else if ()
        {
            lblWinner.Text = "Character 2 is better";
        }
        else
        {
            lblWinner.Text = "These characters are equal";
        }

    }

^这是我的if语句。我试图使条件类似(selectedCharacter.getTotal() > selectedCharacter2.getTotal()),但无法访问selectedCharacter

所以我的问题是,有没有办法访问子程序中的selectedCharacter,还是应该以另一种方式执行此操作?

感谢您的帮助, :)

3 个答案:

答案 0 :(得分:4)

除非变量(例如selectedCharacter)位于范围中,否则不能使用该变量来尝试访问它。在C#中,一组{}创建了一个新范围。代码可以访问自己的范围和嵌套的任何范围。

因为selectedCharacter变量是IndexChanged方法的本地变量,所以它不在displayWinner的范围内。要修复它,请将该变量移动到范围内。现在两种方法都可以访问它:

Character selectedCharacter;
Character otherSelectedCharacter;

public void lstbxCharacter1_SelectedIndexChanged(object sender, EventArgs e)
{
    selectedCharacter = characters.ElementAt(lstbxCharacter1.SelectedIndex);
     ....
}

public void DisplayWinner()
{
   if (selectedCharacter.IsBetterThan(otherSelectedCharacter))
    ...
}

为了避免在没有选择的情况下调用DisplayWinner的情况(因此selectedCharacter.<anything>会抛出NullReferenceException),您可以使用空条件运算符和空合并来自动失败检查(除了其他方式,但这个很短并且重点)。

if (selectedCharacter?.IsBetterThan(otherSelectedCharacter) ?? false)

答案 1 :(得分:1)

您需要将selectedCharacter设为承载控件的表单的成员变量。

Character m_selectedCharacter放在方法之外的代码中。 (正常使用成员变量的命名标准,因此m_前缀)

答案 2 :(得分:1)

您无法从其他方法访问selectedCharacter,因为变量的生命周期在执行方法后结束。
如果要在事件SelectedIndexChanged之外使用selectedCharacter,则需要在托管控件的Container中声明变量。通过这样做,您的变量将对容器内部的所有方法和属性可见*(也在外部,它取决于accessibility level)。建议:在使用非空属性控件之前,否则您将获得NullPointer Exception *除static之外的所有方法和属性