在void中创建类的对象并在main中使用它

时间:2014-12-06 16:04:06

标签: c# .net winforms scope

我遇到以下代码的问题:

public class Player
{
    public int money;
    public void setMoney(int amount)
    {
        money = amount;
    }
}

public void init()
{
    Player Player1 = new Player();
}

public void main()
{
    Player1.money = 9001;
}

private void mainForm_Load(object sender, EventArgs e)
{
    init();
    main();
}

当我运行给定的代码时,我得到一个错误,即Player1在该上下文中不可用。 所以我想我不能在init中创建一个Player对象,然后在main中使用它。

我该如何解决这个问题?

问候,dncrft

2 个答案:

答案 0 :(得分:2)

您在Player中声明init()的实例,C#中的变量范围规则定义您不能在其定义的范围之外使用变量。因此Player1仅可在init()中访问。如果您想在init()之外使用它,您应该在main()

可见的范围内定义它
public class Player
{
 public int money;
 public void setMoney(int amount)
 {
  money = amount;
 }
}
Player Player1;
public void init()
{
 Player1 = new Player();
}

public void main()
{
 Player1.Money = 9001;
}

private void mainForm_Load(object sender, EventArgs e)
{
 init();
 main();
}

代码中的一些问题:
1. Player.money是字段,如果它有一个setter,请尝试将其设置为私有并使用setter和getter或将其设置为属性public int money { set; get; }
2.考虑naming conventions in C#
3.考虑使用nested classes

所以我建议这段代码

public class Player
{
   public int Money { get; set; }
}

public MainForm : Form
{
  private Player player1;

  public void Init()
  {
     this.player1 = new Player();
  }

  public void Main()
  {
     this.player1.money = 9001;
  }

  private void mainForm_Load(object sender, EventArgs e)
  {
    Init();
    Main();
  }
}

答案 1 :(得分:2)

您的问题是Player的实例超出了范围。此外,您可能希望使用您的财产的速记声明。

public class Player
{
    public int Money {get; set;}
}
public void main()
{
    Player player = new Player();
    player.Money = 9001;
}