【问题标题】:Create object of class in void and use it in main [closed]在void中创建类对象并在main中使用它[关闭]
【发布时间】:2014-12-06 16:04:05
【问题描述】:

以下代码有问题:

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

【问题讨论】:

  • 请不要发布假代码。
  • Player1 是一个局部变量。只有使用 init() 方法才能访问它。
  • 是的,我意识到了。但我不能添加“公共”关键字或类似的东西:/ 顺便说一句,它不是假代码。只是我原来的一个较短的英文翻译版本。
  • 这段代码非常简单。当然,真正的问题要复杂得多。在这种情况下,真正问题的正确解决方案可能与该问题的解决方案不同。
  • 是的,但我的观点是正确的。你发布了假代码。这意味着当您输入代码而不是从编辑器粘贴代码时可能会出现其他错误。你不必听我的建议。但我仍然会提供它。永远不要发布虚假代码。始终直接从您的编辑器中复制代码,以便我们确保获得实际代码。

标签: c# .net winforms scope


【解决方案1】:

您在init() 中声明了Player 的实例,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();
  }
}

【讨论】:

  • 属性的命名约定为Pascal Case。如msdn.microsoft.com/en-us/library/vstudio/… 所述。所以,在他的情况下,它将是Money
  • 我刚刚更改了 OP 的代码,正在编辑@LuisLavieri
  • 好吧,这将是一个解决方案——getter 和 setter 也是好主意——我写面向对象的代码太久了。范围的事情引导我走向正确的方向,我想我现在知道另一种更好的解决方案..会尝试一下。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2013-09-22
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多