方法返回值在更改为另一个表单后重置值

时间:2014-01-05 12:02:56

标签: c# forms

我有一个Form2,其中包含一个Hangman游戏(是的,这是类似我在前一个问题中所指的Hangman游戏)并且一旦玩家完成游戏,玩家将被带来Form4和Form6两种形式中的任何一种(一种是获胜的祝贺形式,一种是失败的嘲讽/失败形式),在Form4和Form6两种形式中,都有一个标签显示玩家从中获得的分数以前的Form2。

我已经放置了一种方法来返回Form2中得分的值。

public int getScore()
{
    return score;
} 

然后在Form4和Form6两种形式中,每种形式都有这些代码。

Form4

private void Form4_Load(object sender, EventArgs e)
{
    Form2 game = new Form2();
    lblFinalScore.Text += game.getScore().ToString(); 
}

Form6

private void Form6_Load(object sender, EventArgs e)
{
    Form2 game = new Form2();
    lblFinalScore.Text += game.getScore().ToString(); 
}

因此,在通过Form2并玩游戏之后,例如,当我赢得游戏并得到7分,并且Form4出现时,lblFinalScore显示0 ...为什么?! 请帮忙......

2 个答案:

答案 0 :(得分:0)

如果使用new关键字,则创建Form2类的新实例。 这样您就可以使用两个不同的实例。不同的实例具有不同值的数据字段。

如果要从类的任何内容访问相同的数据字段,请使用static关键字。您可以将分数值存储在静态字段中,这样您就可以轻松访问它。

如果您在类中定义了静态字段,则可以从任何实例访问该字段。但是,强烈建议不要使用静态字段,因为这违反了基本的OO原则。

示例:

class Program
    {
        static void Main(string[] args)
        {
            ExampleClass ex1 = new ExampleClass();
            ExampleClass ex2 = new ExampleClass();

            ex1.normalfield = "new value for ex1";
            ex2.normalfield = "new value for ex2";
            ExampleClass.staticfield = "static value";

            Console.WriteLine(ex1.normalfield);
            Console.WriteLine(ex2.normalfield);
            Console.WriteLine(ExampleClass.staticfield);

        }

        class ExampleClass
        {
            public string normalfield = "";
            public static string staticfield = "";
        }

}

传递表单的原始实例可能是更适合您的情况的方法。 这可以通过存储对Form的引用或实现Singleton模式来完成。

然而,在我看来,最好的解决方案是将游戏逻辑的表现分开。您应该使用不同的类来实现游戏逻辑并存储连接到游戏的数据值,并且表单类应该只负责呈现代表游戏状态的对象的当前状态。

答案 1 :(得分:0)

您正在创建 Form2的两个不同实例。请参阅Form2的实际原始实例。

Form4Form6上都有类级别变量,并从相应的构造函数设置它。从Form2传递实例。

请参阅Passing a value from one form to another