0

私は現在、「たまごっち」プログラムの構築を含む uni プロジェクトのプログラムに取り組んでいますが、各ペットに関連する値を格納するために使用したクラス構成に関連するかなり早い段階でエラーに遭遇しました。レコードの一部。ただし、プログラムをトレースすると、変数が初期化されていないように見え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このコードは、行のコメントが解除されている場合でも、残りの初期化 (メソッド内の多数の行をコメントアウトした場所) をスキップします。これは問題に関連している可能性がありますか?

4

6 に答える 6

7

ペット自体に値を設定することはありません。

Load メソッドまたはコンストラクターに次を配置する必要があります。

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

プログラムの開始時には、これらの Pet1...Pet​​4 値は null であり、上記のコードのように明示的にインスタンス化しない限りそのままです。

このコードをコンストラクターに入れる場合は、クラスstaticと同様にコンストラクターであることを確認してください。GlobalVarsstatic

于 2013-01-02T14:28:08.070 に答える
6

何らかの方法でプロパティを初期化する必要があります。これらは何も設定されていないため、デフォルトで になります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; }
}
于 2013-01-02T14:28:37.797 に答える
2

なんで?初期化していないからです。静的 ctor を作成し、使用するすべてのプロパティを初期化できます。

static GlobalVars     
{
    // ...
    static GlobalVars()
    {
        Pet1 = new TTamagotchiPet();
        // ...
    }
}
于 2013-01-02T14:26:40.183 に答える
1

参照型である多くのクラス変数を宣言しました。

クラス変数(静的またはインスタンス)を宣言すると、変数の型がdefault(T)どこに割り当てられTます。参照型の場合 (例: class T)、これはnullです。

これらを他の値に初期化したい場合は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; } }
于 2013-01-02T14:30:22.090 に答える
0

次のようなものが必要です:

static class GlobalVars
{
    public static TTamagotchiPet Pet1 { get; set; }
    static GlobalVars() 
    {
        Pet1 = new TTamagotchiPet();
    }
}
于 2013-01-02T14:28:44.293 に答える
0

Pet1問題は、オブジェクトを実際に初期化しないことです。この呼び出しをLoadメソッドに追加してみてください。

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

NullReferenceExceptionfor への呼び出しに出くわすべきではありませんPet1。もちろん、他の Pet オブジェクトも初期化する必要があります。

于 2013-01-02T14:29:52.490 に答える