2009-02-11 5 views

Répondre

3

Je ne pense pas qu'il y ait de bonnes raisons. Toute mise en œuvre de GetHashCode devrait être assez rapide pour mettre dans une propriété. Cela dit, il y a plenty of design flaws dans le framework .Net, certains petits, d'autres sérieux. Cela semble être un petit.

+10

Basé sur les directives spécifiées dans les directives de conception de cadre, si le calcul est "cher", il devrait être une méthode pas une propriété. Comme le calcul par hashcode est une inconnue complète pour les objets personnalisés en ce qui concerne le Framework, c'est mieux en tant que fonction. –

19

Probablement parce qu'il nécessite un calcul, et l'exposer comme une propriété pourrait impliquer que le hashcode est déjà disponible gratuitement.

Edit: lignes directrices à ce sujet: Properties versus Methods

« L'opération est assez cher que vous voulez communiquer à l'utilisateur qu'ils devraient envisager la mise en cache du résultat. »

Peut-être que GetHashCode est assez cher dans certains cas.

+0

Merci, y a-t-il une ligne directrice pour ne pas avoir de propriétés nécessitant un calcul? La raison pour laquelle je demande est, j'ai vu beaucoup de choses qui calcule quand vous accédez à la propriété. –

+1

@Joan, parfois il peut être lent à générer un bon Hashcode –

0
propriétés

ne doivent être utilisées que si le calcul derrière eux est vraiment rapide ou mises en cache

en plus la plupart du temps la seule logique des propriétés devrait être la validation

-2

Vous devez vous rappeler que le .NET Framework est conçu pour être accessible par une grande variété de langues.

En théorie, vous pouvez créer un compilateur incapable de redéfinir correctement les propriétés. Alors que cela ferait un compilateur assez moche, ce ne serait pas nécessairement illégal. (Rappelez-vous que les propriétés ne sont que des méthodes avec des méta-données)

+1

Vous pouvez également créer un compilateur qui ne peut pas remplacer les méthodes. Et beaucoup d'autres.Les interfaces NET nécessitent d'overring une propriété. – MichaelGG

+1

Beaucoup d'interfaces nécessitent de remplacer une propriété, mais Object est le grand-père de tout, pourquoi ne pas le garder simple? – Guvante

1

Outre qu'une propriété n'est rien d'autre qu'une méthode getter et une méthode setter, d'un point de vue design une propriété ne devrait jamais contenir de calculs autres que l'initialisation ou la validation, par exemple:

private object _obj; 
public object Obj 
{ 
    get 
    { 
    if(_obj == null) 
    { 
     _obj = new object(); 
    } 
    return _obj; 
    } 
    set 
    { 
    if(value == badvalue) 
    { 
     throw new ArgumentException("value"); 
    } 
    _obj = value; 
    } 
} 

GetHashCode() ne contient pas de nombreux calculs, mais il pourrait contenir de telles opérations à long exploitation (juste du fait qu'il pourrait calculer la hashcode d'un objet de manière complexe), ce pourquoi sa méthode à la place d'une propriété.

2

Souvent, il est impossible de définir un HashCode pour une classe qui fait depuis:

par exemple les objets de la classe n'ont pas un concept bien défini de identité.

Par conséquent, il est courant que la méthode GetHashCode() renvoie une exception NotImplementedException. Ceci serait bien sûr un problème si HashCode était une propriété, car la plupart des gens (et débogueurs) supposent qu'il est toujours valide pour obtenir la valeur d'une propriété

+1

Presque tous les objets de classe doivent généralement avoir une sémantique de référence ou une sémantique de valeur immuable. Les objets avec une sémantique de référence ont un concept d'identité clair (l'objet X et l'objet Y sont égaux si et seulement si X et Y se réfèrent au même objet). Les objets ayant une sémantique de valeur immuable ont un concept d'identité clair (l'objet X et l'objet Y sont égaux s'ils ont des valeurs égales). Quels types d'objets n'auraient pas un concept d'identité bien défini? – supercat

+0

@supercat, Equals ne doit renvoyer true que pour l'objet avec le même HashCode, cependant souvent je vois une méthode equals définie juste pour l'utilisation de tests unitaires sur obejct qui ne sont pas immuables. Donc, pour arrêter l'avertissement du compilateur, GetHashCode() doit être surchargé, mais sachez que l'objet ne devrait jamais être utilisé comme une clé. Sans une méthode equals utile sur les objets, les actifs des collections de nUnit ne fonctionnent pas. –

+0

Ce serait un abus définitif de Object.Equals(). En fait, je souhaite que la méthode ait été nommée Equivalent(), plutôt qu'Equals(), car c'est le concept d'équivalence, plutôt que le nom, qui est universellement applicable, et dans certains cas il peut être utile pour certains objets d'avoir une méthode Equals() avec une sémantique plus lâche. Par exemple, si j'avais mes druthers, Equivalent (1.00m, 1.0m) serait faux, mais Equals (1.00m, 1.0m) serait vrai. Equals serait défini par spec comme une propriété transitoire, contrairement à Equivalent qui serait (chaque fois implémenté correctement) immuable. – supercat

Questions connexes