Das erste, was Sie brauchen, um sich zu fragen, ist dies:
„Wenn ich zwei Instrumente mit ID == 53 haben, bedeutet dann, dass sie auf jeden Fall das gleiche Instrument sind, egal was Oder gibt es eine? sinnvoller Fall, wo sie anders sein könnten? "
Angenommen, die Antwort ist "sie sind beide gleich. Wenn eine andere Eigenschaft unterscheidet, das ist entweder ein Fehler oder weil ein solches Objekt nach dem anderen erhalten wurde, und das wird sich bald genug lösen (wann auch immer Thread der Verarbeitung ist Verwenden Sie das ältere Instrument, hört auf, es zu benutzen) "dann:
Zuerst, intern, verwenden Sie einfach, was Sie handier finden. Sie werden wahrscheinlich feststellen, dass dies die int
die ganze Zeit zu gehen, obwohl Sie einige Typ-Sicherheit aus bestehen, dass ein Instrument
an die Methode übergeben wird. Dies gilt insbesondere, wenn alle Instrument
Konstruktion von einem internal
oder private
Konstruktor über Factory-Methoden zugegriffen wird, und es gibt keine Möglichkeit für einen Benutzer des Codes zum Erstellen eines falschen Instrument
mit einer ID, die nichts in Ihrem System übereinstimmt.
definiert Gleichheit als solche:
public class Instrument : IEquatable<Instrument>
{
/* all the useful stuff you already have */
public bool Equals(Instrument other)
{
return other != null && Id == other.Id;
}
public override bool Equals(object other)
{
return Equals(other as Instrument);
}
public override int GetHashCode()
{
return Id;
}
}
Nun, vor allem wenn man bedenkt, dass die oben wahrscheinlich die meiste Zeit zu inlined, gibt es so ziemlich keine Implementierung Unterschied, ob wir verwenden, um die ID oder das Objekt in Bezug auf die Gleichheit und damit auch in Bezug auf ihre Verwendung als Schlüssel.
Jetzt können Sie alle Ihre öffentlichen Methoden in einem der folgenden Mittel definieren:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument];
}
Oder:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return instrumentInfos[instrument.Id];
}
Oder:
public InstrumentInfo GetInstrumentInfo(Instrument instrument)
{
return GetInstrumentInfo(instrument.Id);
}
private InstrumentInfo GetInstrumentInfo(int instrumentID)
{
return instrumentInfos[instrumentID]
}
Die Auswirkungen auf die Leistung wird sei immer gleich. Der Code, der Benutzern präsentiert wird, ist typsicher und garantiert, dass keine falschen Werte weitergegeben werden. Die gewählte Implementierung kann einfach diejenige sein, die Sie aus anderen Gründen als bequemer empfinden.
Da es Sie nicht mehr kosten wird, das Instrument selbst als Schlüssel zu verwenden, würde ich Ihnen immer noch empfehlen, dies (die erste der drei oben genannten Optionen) als Typ-Sicherheit zu tun und es schwierig zu machen falsche Werte übergeben, gilt dann auch für Ihren internen Code. Wenn Sie auf der anderen Seite feststellen, dass eine Reihe von Anrufen nur die ID trotzdem verwenden (wenn z.Sie sprechen mit einer Datenbankschicht, für die nur die ID irgendetwas bedeutet). Dann wird das Ändern dieser Orte für Sie schnell und einfach und für den Benutzer unsichtbar.
Sie geben Ihren Benutzern auch die Möglichkeit, Ihr Objekt als Schlüssel zu verwenden und schnelle Gleichheitsvergleiche zu machen, wenn es ihnen dazu passt.
Sehr nette Frage. +1 – Mohayemin
Oder vielleicht GetInstrumentInfo sollte eine Methode auf Instrument sein? –
@Peri hat einen sehr guten Punkt. Oder vielleicht wäre ein Immobilien-Getter noch besser. –