Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

and,or vs andalso,orelse

Îåêßíçóå áðü ôï ìÝëïò tsomos. Τελευταία δημοσίευση από το μέλος tsomos στις 02-10-2008, 22:19. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-10-2008, 16:58 45067

    and,or vs andalso,orelse

    Να ρωτησω κατι. Εχω εναν κωδικα σε vb .net. Σε αυτον μεχρι τωρα εχω παντα And και Or operators.
    Ειδα ομως οτι υπαρχει και το AndAlso, OrElse που ειναι circuit λεει, δηλ, ειναι καλυτερο να εχω αυτους για λογους performance.

    Ειναι ομως πανακεια να παω στον κωδικα μου και να αλλαξω ΟΛΑ τα and με τα andlaso και ΟΛΑ τα or με τα orelse;

    Απο οτι οτι καταλαβα ναι, ειναι πανακεια και δεν αλλαζει τιποτα , πχ

    if (a>1 and b>1) or (c>1 and d>1) then ....
    Θα μπορυσε να ειναι επισης
    if (a>1 andalso b>1) orelse(c>1 andalso d>1) then ....
    Και θα ειχε παντα το ιδιο αποτελεσμα...σωστα;

    Αρα να υποθεσω οτι παντα μα παντα οπου εχω and βαζω andalso και οπου or βαζω orelse;
  •  02-10-2008, 17:33 45069 σε απάντηση της 45067

    Απ: and,or vs andalso,orelse

    Ως προς το αποτέλεσμα, όχι, δεν θα βρεις διαφορά.

    Διαφορά υπάρχει ως προς το performance για τον εξής λόγο:
    Αν πεις if (a>1 and b>1), τότε θα προκύψει το αποτέλεσμα της παράστασης ελέγχοντας αν  a>1, ελέγχοντας αν b>1 και κάνοντας AND τα δύο αποτελέσματα.
    Αν πεις if (a>1 andalso b>1), τότε θα προκύψει το αποτέλεσμα της παράστασης ελέγχοντας αν  a>1 και επειδή υπάρχει AND, αν το a είναι 1, τότε και μόνο τότε θα προχωρήσει να ελέγξει και το δεύτερο τμήμα της παράστασης, καθώς αν το a είναι <1 τότε δεν έχει νόημα να το ελέγξει. Ανάλογα δουλεύει και το orelse.

    Τώρα, το σημείο που υπάρχει συνήθως πρόβλημα είναι ότι αν αντί για τέτοιες απλές παραστάσεις έχεις κάποιες συναρτήσεις που απιστρέφουν true/false και ο έλεγχος σου είναι του τύπου:
    if (customerIsActive and orderIsEmpty) τότε θα τρέξει και τα δύο functions. Αν βρεθείς με κώδικα που δεν είναι δικός σου, μην βιαστείς να μετατρέψεις το and σε andalso γιατί μπορεί αυτός που έγραψε τον κώδικα να έχει υπολογίσει εν γνώσει του (αν και πολύ κακώς) ότι θα τρέχουν και τα δύο functions. Όσο το κάθε function κάνει ότι κάνει μέσα στο scope του (δηλαδή δεν πειράζει πράγματα έξω από αυτό) τότε δεν υπάρχει πρόβλημα. Αν όμως όχι... Έχεις στα χέρια σου ένα πολύ ωραίο bug.


    Vir prudens non contra ventum mingit
  •  02-10-2008, 17:40 45070 σε απάντηση της 45067

    Απ: and,or vs andalso,orelse

    Για τον έλεγχο απλών integers δεν πρόκειται να δεις διαφορές. Δοκίμασα να κάνω ελέγχους μέχρι για 1.000.000 iterations και δεν είδα μεγάλη διαφορά. Αν όμως έχεις να κάνεις πιο δύσκολους ελέγχους που περιλαμβάνουν και κλήσεις συναρτήσεων τότε φυσικά θα δεις διαφορές.

    π.χ. if (myvar=5 andalso getTotal(items)>1000 andalso getAverage>100) then...

    Αν το myvar είναι σπάνια 5 τότε το andalso θα βοηθήσει πολύ!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  02-10-2008, 17:41 45071 σε απάντηση της 45069

    Απ: and,or vs andalso,orelse

    Δηλ, με λιγα λογια, εφοσον το orderIsEmpty δεν συνδεεται-συσχετιζεται το αποτελεσμα του, κατ' οιονδηποτε τροπο με το customerIsActive τοτε μπορω σαν πανακεια να εχω andalso και orlse. Σωστα;
  •  02-10-2008, 18:55 45076 σε απάντηση της 45071

    Απ: and,or vs andalso,orelse

    Λίγο πολύ ναι, ωστόσο μπορεί τα δύο functions να μην σχετίζονται μεταξύ τους αλλά να ενημερώνουν κάποιους counters στην φόρμα ή να γράφουν κάτι σε κάποιο αρχείο ή οτιδήποτε άλλο που δεν αφορά αποκλειστικά μέσα στον κώδικα του function.


    Vir prudens non contra ventum mingit
  •  02-10-2008, 22:19 45090 σε απάντηση της 45076

    Απ: and,or vs andalso,orelse

    Ευχαριστω...πηρα τις απαντησεις που ηθελα....
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems