IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Overloads Function GetHashCode


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut Overloads Function GetHashCode
    Bonjour la communauté.

    Voilà, j'écris des classes pour des développeurs.
    Je souhaitais enlever de l'intellisense les quelques fonctions qui ne sont pas utiliser par les développeurs, et rends l'utilisation des objets moins intuitifs...

    Parmi eux : ToString, Equals (..) et GetHAshCode.

    Pour les rendre invisible j'ai simplement fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)>
    Public Overloads Function GetHashCode() As Integer
          Return Nothing
    End Function
    Problème : Puisque GetHAshCode retourne tout le temps Nothing... On ne peut plus tester si l'objet contient Nothing (pour savoir si l'objet est chargé). Et j'aimerai bien garder cette fonctionnalité.

    Question : Que doit on mettre dans cette méthode ? En cherchant sur internet, certains développeurs ont l'air de le réécrire à leur sauce, ce qui ne semble pas toujours propre. Idéalement, moi j'aimerai ne pas la toucher cette méthode, mais la rendre invisible. Quelqu'un aurait il une solution ou une méthode ?

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour mactwist69,

    Et ainsi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)>
        Public Overrides Function GetHashCode() As Integer
            Return MyBase.GetHashCode()
        End Function
    Elle n'est plus visible avec l'intellisense, mais il est toujours possible de l'utiliser. (pas testé au travers d'une dll)
    Ou alors j'ai loupé quelque chose dans la question.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Personnellement, je ne pige pas ; empêcher de voir des méthodes disponibles sur tout les objets juste parce que ... parce que je ne sais pas trop quoi d'ailleurs ; en quoi c'est moins intuitif ?
    Par contre les développeurs qui veulent les utiliser eux risquent d'être gênés, ne les voyant pas ils n'auront pas forcément l'idée de les utiliser (alors qu'il suffit de les écrire "manuellement" pour y avoir accès mais encore faut-il le savoir)
    Sans parler du fait que cet attribut n'est qu'une indication à l'éditeur qui n'est pas tenu de la respecter (par exemple le plugin Resharper lui s'en fiche et peut-être que SharpDevelop ou Xamarin studio font de même)

    Bref tant de "travail" pour potentiellement si peu d'effets et l'obligation de modifier l'implémentation "classique" de la classe (parce qu'a priori s'il n'y avait pas le besoin de cacher ces méthodes elles ne seraient pas surchargées) je ne pige pas

  4. #4
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Salut rv26t,

    En fait en y regardant de plus prêts, c’était la fonctionnalité ToString qui m'intéressait.

    En effet, lorsqu'un objet est instancié, et qu'on test si il est "Nothing" ça retourne Faux.
    Si au contraire on assigne Nothing à l'objet, alors il retourne Vrai pour le même teste.

    Ce que certains développeurs apprécient car on peut vérifier simplement l'instanciation.

    Et il ne s'agissait donc pas de GetHashCode, mais de ToString.
    Mais j'ai tout de même utilisé MyBase comme tu l'as indiqué, et ça marche très bien :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)>
    Public Overloads Function ToString() As String
             Return MyBase.ToString
    End Function
    Bien que j'ai du mal à comprendre ce que me remonte MyBase sachant que ma classe ne dérive de rien...
    Mais bon ça marche, je vais pas me plaindre.


    Merci bien !

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    En fait en y regardant de plus prêts, c’était la fonctionnalité ToString qui m'intéressait.

    En effet, lorsqu'un objet est instancié, et qu'on test si il est "Nothing" ça retourne Faux.
    Si au contraire on assigne Nothing à l'objet, alors il retourne Vrai pour le même teste.

    Ce que certains développeurs apprécient car on peut vérifier simplement l'instanciation.
    Je ne vois pas le rapport entre ToString et le fait de vérifier si une variable est nulle

    Citation Envoyé par mactwist69 Voir le message
    Bien que j'ai du mal à comprendre ce que me remonte MyBase sachant que ma classe ne dérive de rien...
    Si, elle dérive de Object, comme toutes les classes qui n'ont pas de classe de base explicite

  6. #6
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je ne vois pas le rapport entre ToString et le fait de vérifier si une variable est nulle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If MonObjet IS Nothing Then
    Lorsque l'objet est instancié, le test renvoi False.
    Quand l'objet n'est pas instancié, il renvoi True.

    Lorsque ToString a été écrasé (pour envoyer toujours nothing), ce test renvoi toujours True, Il est là le rapport.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If MonObjet IS Nothing Then
    Lorsque l'objet est instancié, le test renvoi False.
    Quand l'objet n'est pas instancié, il renvoi True.

    Lorsque ToString a été écrasé (pour envoyer toujours nothing), ce test renvoi toujours True, Il est là le rapport.
    Euh... non, le fait de redéfinir ou de masquer ToString ne change rien à ce test. Je te mets au défi de me prouver le contraire
    Ca pourrait avoir un sens si tu faisais If MonObjet.ToString() Is Nothing, sauf que ça planterait quand MonObjet est Nothing

  8. #8
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Salut rv26t,

    En fait en y regardant de plus prêts, c’était la fonctionnalité ToString qui m'intéressait.

    En effet, lorsqu'un objet est instancié, et qu'on test si il est "Nothing" ça retourne Faux.
    Si au contraire on assigne Nothing à l'objet, alors il retourne Vrai pour le même teste.

    Ce que certains développeurs apprécient car on peut vérifier simplement l'instanciation.
    Toi tu viens du php ou d'un langage de ce genre qui compare des chaînes à la structure de l'objet, non ?

    En tout cas sache que nombre de développeurs C# considèreront ça comme un comportement exécrable, surprenant, qui va à l'encontre du langage et de ses conventions. Pour ma part je te conseille de travailler en C# avec les habitudes du C# et en php avec les habitudes du php.

    Bien que j'ai du mal à comprendre ce que me remonte MyBase sachant que ma classe ne dérive de rien...
    Si, toute classe et tout type valeur dérive de Object.

  9. #9
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Toi tu viens du php ou d'un langage de ce genre qui compare des chaînes à la structure de l'objet, non ?

    En tout cas sache que nombre de développeurs C# considèreront ça comme un comportement exécrable, surprenant, qui va à l'encontre du langage et de ses conventions. Pour ma part je te conseille de travailler en C# avec les habitudes du C# et en php avec les habitudes du php.

    Ben raté, je ne fais que du VB que j'essai de faire en VB.

    Ce n'est pas moi qui ait mis en place ces tests de Nothing sur la structure de l'objet.
    Mais je poserai la question à celui qui à mis ça en place.

  10. #10
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Bien que j'ai du mal à comprendre ce que me remonte MyBase sachant que ma classe ne dérive de rien...
    Euh si ta classe dérive d'Object

    Citation Envoyé par mactwist69 Voir le message
    En effet, lorsqu'un objet est instancié, et qu'on test si il est "Nothing" ça retourne Faux.
    Si au contraire on assigne Nothing à l'objet, alors il retourne Vrai pour le même teste.
    pas sûr d'avoir compris, pour tester la nullité d'une instance vous la comparez avec la chaine "Nothing" ; y'a mieux comme moyen


    grillé par DonQuiche

  11. #11
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Puisque GetHAshCode retourne tout le temps Nothing... On ne peut plus tester si l'objet contient Nothing (pour savoir si l'objet est chargé). Et j'aimerai bien garder cette fonctionnalité.
    Tu réalises qu'en modifiant ainsi le comportement de GetHashCode les dictionnaires et HashSet qui contiendraient ces objets rameraient comme ce n'est pas permis, ce qui sur un serveur serait une sacrée brèche pour une attaque DDOS ?

    Les dictionnaires et HashSet reposent en effet sur GetHashCode avec pour hypothèse que statistiquement les hashes sont bien distribués. C'est ce qui fait que Dictionary.Get ou HashSet.Contains tournent en O(1) et non O(n): pour un hash donné il n'y a en moyenne qu'un élément à inspecter.

    Citation Envoyé par mactwist69 Voir le message
    Question : Que doit on mettre dans cette méthode ? En cherchant sur internet, certains développeurs ont l'air de le réécrire à leur sauce, ce qui ne semble pas toujours propre. Idéalement, moi j'aimerai ne pas la toucher cette méthode, mais la rendre invisible. Quelqu'un aurait il une solution ou une méthode ?
    Les hashes doivent être uniques (dans la mesure du possible), bien distribués et demeurer identiques même si tu changes les champs du type. Ce sont les contraintes que tu dois satisfaire et c'est loin d'être une question simple.

    L'implémentation par défaut offre ces garanties pour les classes avec une valeur générée à la création de l'instance. En revanche pour les types valeurs l'implémentation mélange les champs, donc si tu en changes un le hash changera et selon les valeurs que peuvent prendre tes champs le résultat pourrait être mal distribué.

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    DonQuiche résume bien le problème. Cette méthode n'est pas là pour faire joli, elle a une vraie utilité, et il ne faut pas l'implémenter n'importe comment, sinon on casse tout...

    Si tu veux vraiment la cacher (ce que je trouve plus que discutable), prends plutôt la solution de rv26t.

  13. #13
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Tu réalises qu'en modifiant ainsi le comportement de GetHashCode les dictionnaires et HashSet qui contiendraient ces objets rameraient comme ce n'est pas permis, ce qui sur un serveur serait une sacrée brèche pour une attaque DDOS ?
    Et bien non, je ne réalisais pas.
    C'est bien noté.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/10/2013, 13h46
  2. Réponses: 4
    Dernier message: 07/10/2005, 15h28
  3. [postgreSQL] équivalent de la function 'instr'
    Par Dra_Gun dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2003, 16h09
  4. [Dev c++ 4] implicite declaration of function "int kbhi
    Par Torpedox dans le forum Dev-C++
    Réponses: 5
    Dernier message: 01/01/2003, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo