0

私は1つの製品クラスを持っています:

       public class Product
{
    private string firstname;
    private string lastname;
    private string email;

    public Product()
    {
    }

    public Product(string firstname, string lastname, string email)
    {
        this.Firstname = firstname;
        this.Lastname = lastname;
        this.Email = email;
    }

    public string Firstname
    {
        get
        {
            return firstname;
        }
        set
        {
            firstname = value;
        }
    }

    public string Lastname
    {
        get
        {
            return lastname;
        }
        set
        {
            lastname = value;
        }
    }

    public string Email
    {
        get
        {
            return email;
        }
        set
        {
            email = value;
        }
    }

    public virtual string  GetDisplayText(string sep)
    {
        return Firstname + sep + Lastname + sep + Email;
    }

}

ICompare を実行しているもう 1 つのクラスを作成します

       public class PersonSort : IComparer<Product>
{
    public enum CompareType
    {
        Email
    }

    private CompareType compareType;

    public PersonSort(CompareType cType)
    {
        this.compareType = cType;
    }

    public int Compare(Product x, Product y)
    {
        if (x == null) throw new ArgumentNullException("x");
        if (y == null) throw new ArgumentNullException("y");

        int result;
        switch (compareType)
        {
            case CompareType.Email:
                return x.Email.CompareTo(y.Email);
            default:
                throw new ArgumentNullException("Invalid Compare Type");
        }
    }
}

次に、ProductList クラスを呼び出します

        List<Product> person;

          public void Sort()
    {
        person.Sort(new PersonSort(PersonSort.CompareType.Email));
    } 

次に、このメソッドを Form で呼び出します。

       private ProductList products = new ProductList();

           private void button4_Click(object sender, EventArgs e)
    {
        products.Sort();
    }

しかし、null 例外が表示されます:オブジェクト参照がオブジェクトのインスタンスに設定されていません

4

3 に答える 3

3

nullどこかに参考書があります。リストが初期化されていることを確認してください。また、Product.Email正しく設定されていますか?

StringComparer代わりに使用することもできます。交換

return x.Email.CompareTo(y.Email);

return StringComparer.Ordinal.Compare(x.Email, y.Email);
于 2012-08-17T18:14:00.363 に答える
1

提供されたコードに基づいて、personinProductListは初期化されていません。そうは言っても、質問に例外のコールスタックを含めると、決定的な答えが得られます。

List<Product> person;

List<Product> person = new List<Product>();
于 2012-08-17T18:12:18.927 に答える
1

List<Product> person;

これはどこに値が与えられていますか? person リストを作成して項目を追加する (または項目をリストに追加してから に割り当てるなど)コードが含まれていませんperson。そこにあるバグが問題を引き起こす可能性があります。

public int Compare(Product x, Product y)
{
    if (x == null) throw new ArgumentNullException("x");
    if (y == null) throw new ArgumentNullException("y");

IComparer<T>.Comparenull を渡しても問題ないというドキュメントの一部であり、null 引数は他のどの引数よりも小さいと評価されるため、これは悪い考えです。一緒に使用されるとは思いませんがList<T>.Sort()、比較子を使用するメソッドは null を安全に渡すことに依存する可能性があります。したがって:

public int Compare(Product x, Product y)
{
   if(ReferenceEquals(x, y))//either both null or both the same instance
     return 0;
   if(x == null)
     return -1;
   if(y == null)
     return 1;

それは関連している可能性があります。

最後に、Emailフィールドが null の場合は、

return x.Email.CompareTo(y.Email)

最善の方法は、コンストラクターとセッターにコードを入れて、それが起こらないようにすることです。パラメーターのないコンストラクターを削除し、他のコンストラクターとチェッカーに null チェックを追加して、後でではなくArgumentNullException何かが偽物を作成したときにスローするようにします。Product

比較子にチェックを追加することもできます。

if(x.Email == null || y.Email == null)
  throw new Exception("Cannot compare a user with null email");

これはバグを修正しませんが、追跡するのに役立ちます。

于 2012-08-17T19:30:15.420 に答える