2011-08-15 8 views
0

これは、私はちょうどカントはC#クラス定義HELP

using System; 

namespace ConsoleApplication2 
{ 
    internal class Equipment : IComparable 
    { 
     private readonly string type; 
     private readonly int serialNo; 
     private string colour; 
     public decimal cost; 

     public Equipment(string type, int serialNo) 
     { 
      this.type = type == null ? "" : type.Trim(); 
      this.serialNo = serialNo; 
     } 

     public string Key 
     { 
      get { return type + ":" + serialNo; } 
     } 

     int IComparable.CompareTo(object obj) 
     { 
      return 0; 
     } 
    } 
} 

(a)は、適切な方法O同じ設備項目を表すクラスの異なるインスタンスが考慮されることを確実にオーバーライドに答えるように見えるプロジェクトの質問ですシステム内で同じ。ハッシュテーブルのキーによって

(b)に格納されている(と見出さ)するために、このクラスのインスタンスを有効にするために適切なメソッドをオーバーライド

+1

キーポイントは、あなたが探してしなければならないメソッドはなく、むしろ、このクラスから継承するクラスでは、直接このクラスでは見られないということです。 –

答えて

0

を行う前にこれを読んで起動する必要がありますそれほど簡単ではありません。とにかく、ReSharperによってこの目的のために生成されたコードです。それは完全な解決策です。 (もちろん、あなたのクラス定義に含まれているはずです)。しかし、もしあなたが尋ねられれば、それはなぜ、どのように機能するのでしょうか?それは恥ずかしいかもしれない。

ので、離れて他の人があなたが読ん示唆しているGetHashCodeEqualsから、あなたもGetHashCode 397の謎についてはhttp://msdn.microsoft.com/en-us/library/system.object.referenceequals.aspxなどhttp://msdn.microsoft.com/en-us/library/a569z7k8(v=VS.100).aspx

を調べるかもしれないが、ここでこの質問を見てStackOverflowの上:Why is '397' used for ReSharper GetHashCode override?

 public bool Equals(Equipment other) 
     { 
      if (ReferenceEquals(null, other)) 
      { 
       return false; 
      } 
      if (ReferenceEquals(this, other)) 
      { 
       return true; 
      } 
      return Equals(other.colour, colour) && other.cost == cost && other.serialNo == serialNo && Equals(other.type, type); 
     } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) 
      { 
       return false; 
      } 
      if (ReferenceEquals(this, obj)) 
      { 
       return true; 
      } 
      if (obj.GetType() != typeof (Equipment)) 
      { 
       return false; 
      } 
      return Equals((Equipment) obj); 
     } 

// note: if "Override the appropriate method to enable instances of this class 
// to be stored (and found) by key in a hash table" is supposed to mean that only type and 
// serialNo should be taken into account (since they are used to generate 
// the Key value) - just remove the lines with cost and colour 
     public override int GetHashCode() 
     { 
      unchecked 
      { 
       int result = (colour != null ? colour.GetHashCode() : 0); 
       result = (result*397)^cost.GetHashCode(); 
       result = (result*397)^serialNo; 
       result = (result*397)^(type != null ? type.GetHashCode() : 0); 
       return result; 
      } 
     } 
3

この目的のために等しく、GetHashCodeメソッドのメソッドをオーバーライドする必要があります。比較です

  • オーバーライドGetHashCode()の適切なロジックを持つ