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

Scripts/Batch Discussion :

equals() <> -eq


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut equals() <> -eq
    salut,

    le titre reflète la conclusion que j'ai tiré ce matin apres que je suis tombé sur cette méthode 'equals()' et fait quelques petits tests que voici quelques unes d'elles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PS II> $a = ''
    PS II> $b = [string]::empty
    
    PS II> $a -eq $b
    True
    
    PS II> $a.Equals($b)
    False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    PS II> $a = 5
    PS II> $b = '5'
    
    PS II> $a -eq $b
    True
    
    PS II> $b -eq $a
    True
    
    PS II> $a.Equals($b)
    False
    
    PS II> $b.Equals($a)
    False
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PS II> [int32]$a = 1
    PS II> [int64]$b = 1
    
    PS II> $a -eq $b
    True
    
    PS II> $a.Equals($b)
    False
    d'après ces tests, l'opérateur '-eq' fait une conversion automatique de type si necessaire, tandis que la méthode equals() ne fait aucune conversion, elle compare la valeur et le type à la fois...ceci explique la lenteur de la boucle '1'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # boucle 1
    PS II> measure-command {for($i=0; $i -lt 1000000; $i++) {$i.equals($i)}}
     ~ 19671,6705 ms
    
    # bouclle 2
    PS II> measure-command {for($i=0; $i -lt 1000000; $i++) {$i -eq $i}}
    ~ 6741,3699 ms

    mais, si on on mets des guillemets à la variable "$i" l'opérateur '-eq' va d'abord convertir "$i" en [int] puis va comparer les deux valeurs, ceci explique sa lenteur dans ce deuxieme test:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PS II> measure-command {for($i=0; $i -lt 1000000; $i++) {"$i" -eq $i}}
    ~ 18443,051 ms

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Bonjour Walid,
    ton premier test fonctionne sur mon poste Seven x64 PS v2/v3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $a = ''
    $b = [string]::empty
    $a -eq $b
    #True
    $a.Equals($b)
    #True
    [string]::Equals($a,$b)
    #True
    Citation Envoyé par I'm_HERE Voir le message
    tandis que la méthode equals() ne fait aucune conversion, elle compare la valeur et le type à la fois...
    La méthode Equals manipule des types référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $Test={
      $a -eq $b
      $b -eq $a
      $a.Equals($b)
      $b.Equals($a)
    }
         
    #Sous dotnet une même chaîne utilise la même référence
    rv a,b
    $a='test'
    $b='test'
    &$Test
    #Et en crée une seconde dés que le contenu est modifié
    $b='TEST'
    &$Test
    ou des types valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    rv a,b
    [int32]$a = 1
    [int32]$b = 1
    
    $a -eq $b
    $a.Equals($b)
    
     #On change la valeur sans créé d'adresse
    [int32]$b = 2
    $a -eq $b
    $a.Equals($b)
    
     #On change la valeur sans créé d'adresse
    [int32]$b = 1
    $a -eq $b
    $a.Equals($b)
    Dans ton cas de test les deux types sont différents.

    De plus, les opérateurs -eq -ne se comportent différemment avec un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #manipule des références de tableau
    rv a,b
    $a=1..5
    $b=6..10
    &$Test
     #pointe sur la même référence d'objet
    $b=$a
    &$Test
    D'autre tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $res="string"
    $res -eq $null
    #renvoi False
     
    $res=1..5
    $res -eq 2
    #renvoi 2
    $res -ne 2
    #renvoi 1,3,4,5
     
    $res -eq $null
    #RAS, aucune valeur, le tableau ne contient pas d'élément $null
    $res=@(1,2,$null)
    $res -eq $null
    #RAS
    $res -contains $null
    #true
     
    $res=$null
    $res -eq $null
    #RAS, aucune valeur, le tableau ne contient pas d'élément $null
    
     #Pointe l'objet dotNet de type tableau
    $res.psbase -eq $null
    #renvoi True
    C'est ces comportements qui rendent parfois l'usage de PS déroutant. Mais ceux-ci ne sont pas abordés par les débutants, à moins de vouloir les noyer d'informations ;-).
    Pour les conversions voir aussi la fin de ce post.

Discussions similaires

  1. [Struts] Problème avec logic:equal
    Par Sniper37 dans le forum Struts 1
    Réponses: 9
    Dernier message: 03/03/2011, 15h32
  2. [debutant][struts]: utilisation du tag <logic:equal ...&g
    Par sleepy2002 dans le forum Struts 1
    Réponses: 13
    Dernier message: 23/11/2006, 17h04
  3. Probleme d'equals to
    Par Ditch dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/10/2004, 17h19
  4. [STRUTS] Tag Equal, comparer deux variables
    Par logica dans le forum Struts 1
    Réponses: 2
    Dernier message: 04/06/2004, 12h01
  5. [ Struts ] plusieurs conditions avec equal?
    Par njac dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/06/2004, 09h04

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