9

このコード行に問題があります。

if(String.IsNullOrEmpty(m_nameList[index]))

私は何を間違えましたか?

編集:VisualStudioではm_nameListに赤い色で下線が引かれ、「名前'm_nameList'は現在のコンテキストに存在しません」と表示されますか?

編集2:コードを追加しました

    class SeatManager
{
    // Fields
    private readonly int m_totNumOfSeats;

    // Constructor
    public SeatManager(int maxNumOfSeats)
    {
        m_totNumOfSeats = maxNumOfSeats;

        // Create arrays for name and price
        string[] m_nameList = new string[m_totNumOfSeats];
        double[] m_priceList = new double[m_totNumOfSeats];
    }

    public int GetNumReserved()
    {
        int totalAmountReserved = 0;

        for (int index = 0; index <= m_totNumOfSeats; index++)
        {
            if (String.IsNullOrEmpty(m_nameList[index]))
            {
                totalAmountReserved++;
            }
        }
        return totalAmountReserved;
    }
  }
}
4

3 に答える 3

18

nullの場合m_nameList、に渡す要素を見つけようとするため、それでも爆発しますString.IsNullOrEmpty。あなたが望むだろう:

if (m_nameList == null || String.IsNullOrEmpty(m_nameList[index]))

これは、がnull以外の場合に有効になること前提としています。indexm_nameList

もちろん、これは配列の要素がnullか空か、または配列参照自体がnullかどうかをチェックしています。(タイトルが示すように)配列自体をチェックしたいだけの場合は、次のようにします。

if (m_nameList == null || m_nameList.Length == 0)

編集:これであなたのコードを見ることができます、2つの問題があります:

  • ヘンクが彼の答えで示したように、フィールドが必要なときにローカル変数を使用しようとしています
  • これにより、(フィールドを使用すると)取得されます。ArrayIndexOutOfBoundsException

    for (int index = 0; index <= m_totNumOfSeats; index++)
    

    それはm_totNumOfSeats + 1あなたの限界のために反復を実行します。あなたが欲しい:

    for (int index = 0; index < m_totNumOfSeats; index++)
    

    配列インデックスはC#では0から始まるため、これは無効であることにm_nameList[m_totNumOfSeats]注意てください。したがって、5つの要素の配列の場合、有効なインデックスは0、1、2、3、4です。

メソッドの別のオプションは、GetNumReserved次を使用することです。

int count = 0;
foreach (string name in m_nameList)
{
    if (string.IsNullOrEmpty(name))
    {
        count++;
    }
}
return count;

または、LINQを使用すると、ワンライナーになります。

return m_nameList.Count(string.IsNullOrEmpty);

(しかし、間違った方法でそれを持っていないのは確かですか?予約は、名前がnullまたは空ではなく、nullまたは空でないものになると思いました。)

間違った方法である場合は、代わりにLINQでは次のようになります。

return m_nameList.Count(name => !string.IsNullOrEmpty(name));
于 2012-04-07T08:18:26.937 に答える
6

Edit2の後:

m_nameListコンストラクターのローカル変数として定義 しています。
コードの残りの部分では、フィールドとしてそれが必要です。

class SeatManager
{       
   // Fields
   private readonly int m_totNumOfSeats;
   private string[] m_nameList;
   private double[] m_priceList;

  // Constructor
  public SeatManager(int maxNumOfSeats)
  {
     m_totNumOfSeats = maxNumOfSeats;

     // Create arrays for name and price
     m_nameList = new string[m_totNumOfSeats];
     m_priceList = new double[m_totNumOfSeats];
  }

  ....
}
于 2012-04-07T08:43:34.180 に答える
4

エラーを回避するために、次のようにifでいくつかの事前条件を実行できます。

if(m_nameList == null || index < 0 || m_nameList.Length < index || String.IsNullOrEmpty(m_nameList[index]))

これは、ほとんどすべての条件で(エラーを発生させることなく)正常に機能するはずです...

于 2012-04-07T08:24:01.643 に答える