我正在学校学习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
,还是应该以另一种方式执行此操作?
感谢您的帮助, :)
答案 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
之外的所有方法和属性