繁体   English   中英

有什么想法为什么这个静态类没有初始化?

[英]Any ideas why this static class is not initialising?

我目前正在为一个uni项目开发一个程序,该程序涉及构建“ tamagotchi”程序,但是我很早就遇到了与用于存储与每个宠物有关的值的类构造相关的错误。记录的一部分。 但是,当我跟踪程序时,变量似乎没有初始化,一旦程序首次调用该变量,它将引发NullReferenceException 有什么想法吗?

static class GlobalVars     // Static class used to store pet values as 'global' variables.
{
    public static TTamagotchiPet Pet1 { get; set; }
    public static TTamagotchiPet Pet2 { get; set; }
    public static TTamagotchiPet Pet3 { get; set; }
    public static TTamagotchiPet Pet4 { get; set; }
}

public void frmTamagotchi_Load(object sender, EventArgs e)      // On Load event; initialises Pet 1.
{
    tmrUpdate.Enabled = true;
    GlobalVars.Pet1.Active = true;
    //GlobalVars.Pet1.Dead = false;
    //GlobalVars.Pet1.FunValue = 0;
    //GlobalVars.Pet1.FoodValue = 0;
    //GlobalVars.Pet1.HealthValue = 0;
    //GlobalVars.Pet1.ExertionValue = 0;
    //GlobalVars.Pet2.Active = false;
    //GlobalVars.Pet3.Active = false;
    //GlobalVars.Pet4.Active = false;
}

private void tmrUpdate_Tick(object sender, EventArgs e)     // Update timer. Each tick reduces pet attributes and checks to see if a pet has died, and controls pet states for the animation timer.
{
// First section updates pet attributes and checks to see if health reaches the 100 limit - at which point the pet dies.
    if (GlobalVars.Pet1.Active == true)  //code crashes here
    {
        if (GlobalVars.Pet1.Dead == false)
        {

即使行未注释,代码也跳过了其余的初始化(我在frmTamagotchi_load方法中注释了许多行)。 这可能与问题有关吗?

您永远不会为宠物设置值。

您需要将以下内容放入Load方法或构造函数中:

GlobalVars.Pet1 = new TTamagotchi();
GlobalVars.Pet2 = new TTamagotchi();
GlobalVars.Pet3 = new TTamagotchi();
GlobalVars.Pet4 = new TTamagotchi();

在程序开始时,这些Pet1 ... Pet4值为null,除非您显式实例化它们,否则它们将保持为null,如上面的代码所示。

如果将此代码放在构造函数中,请确保它是static ,因为GlobalVarsstatic类。

您需要以某种方式初始化属性。 由于尚未将其设置为任何值,因此它们将默认为null ,这意味着任何尝试访问成员的尝试都将导致NullReferenceException

静态构造函数可以解决问题:

static class GlobalVars     // Static class used to store pet values as 'global' variables.
{
    static GlobalVars
    {
      Pet1 = new TTamagotchi();
      Pet2 = new TTamagotchi();
      Pet3 = new TTamagotchi();
      Pet4 = new TTamagotchi();
    }

    public static TTamagotchiPet Pet1 { get; set; }
    public static TTamagotchiPet Pet2 { get; set; }
    public static TTamagotchiPet Pet3 { get; set; }
    public static TTamagotchiPet Pet4 { get; set; }
}

为什么? 因为您没有初始化它。 您可以创建一个静态ctor并初始化要使用的所有属性:

static GlobalVars     
{
    // ...
    static GlobalVars()
    {
        Pet1 = new TTamagotchiPet();
        // ...
    }
}

您已经声明了许多作为引用类型的类变量。

声明类变量(静态的或实例的)时,将为其分配default(T) ,其中T是变量的类型。 对于引用类型(例如class T ),它为null

如果您希望将它们初始化为default(T)以外的其他default(T) ,则应在声明时执行赋值操作:

static class ProbablyNotWhatYouReallyNeed
{
    // assigned something other than the default at declaration
    private static TTomagachiPet _pet1 = new TTomagachiPet();

    // You probably don't want to change the *instance*, but rather you want
    // Access to the instance
    public static TTomagachiPet Pet1 { get { return _pet1; } }

您需要类似:

static class GlobalVars
{
    public static TTamagotchiPet Pet1 { get; set; }
    static GlobalVars() 
    {
        Pet1 = new TTamagotchiPet();
    }
}

问题是您实际上从未初始化过Pet1对象。 尝试将此调用添加到您的Load方法中:

tmrUpdate.Enabled = true;
GlobalVars.Pet1 = new TTamagotchiPet();
GlobalVars.Pet1.Active = true;

您不应该碰到NullReferenceException来调用Pet1 显然,您还需要初始化其他Pet对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM