Χύτευση: (newtype) vs. Object ως newtype

ψήφοι
79

Πιθανή Διπλότυπο:
Casting vs χρησιμοποιώντας το ως «κλειδί στο CLR

Ποια είναι πραγματικά η διαφορά μεταξύ αυτών των δύο εκμαγεία;

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

Κανονικά, θα πρέπει και οι δύο να είναι ρητή εκμαγεία στο συγκεκριμένο τύπο;

Δημοσιεύθηκε 05/08/2008 στις 16:42
πηγή χρήστη
Σε άλλες γλώσσες...                            


13 απαντήσεις

ψήφοι
82

Η πρώτη θα ρίξει μια εξαίρεση, αν ο τύπος πηγής δεν μπορεί να ρίχνει με το είδος-στόχο. Το τελευταίο θα οδηγήσει σε SC2 είναι μια μηδενική αναφορά, αλλά καμία εξαίρεση.

[Επεξεργασία]

Αρχική απάντησή μου είναι σίγουρα η πιο έντονη διαφορά, αλλά όπως ο Eric Lippert επισημαίνει , δεν είναι η μόνη. Άλλες διαφορές περιλαμβάνουν:

  • Δεν μπορείτε να χρησιμοποιήσετε το «ως» χειριστή να ρίχνει σε έναν τύπο που δεν δέχεται «μηδενική» ως αξία
  • Δεν μπορείτε να χρησιμοποιήσετε ως "για να μετατρέψετε τα πράγματα, όπως αριθμούς σε μια διαφορετική παράσταση (float σε int, για παράδειγμα).

Και τέλος, χρησιμοποιώντας ως «εναντίον του χειριστή καστ, είστε, επίσης, λέγοντας«Δεν είμαι σίγουρος αν αυτό θα πετύχει.»

Απαντήθηκε 05/08/2008 στις 16:44
πηγή χρήστη

ψήφοι
27

Επίσης σημειώστε ότι μπορείτε να χρησιμοποιήσετε μόνο το ως λέξη-κλειδί με τύπο αναφοράς ή nullable τύπου

δηλαδή:

double d = 5.34;
int i = d as int;

Δεν θα συγκεντρώνουν

double d = 5.34;
int i = (int)d;

θα συντάξει.

Απαντήθηκε 05/08/2008 στις 17:15
πηγή χρήστη

ψήφοι
9

Typecasting χρήση «ως» είναι φυσικά πολύ πιο γρήγορα όταν το cast αποτύχει, καθώς αποφεύγει τη δαπάνη της ρίχνουν μια εξαίρεση.

Αλλά δεν είναι πιο γρήγορα όταν το καστ καταφέρνει. Το γράφημα στο http://www.codeproject.com/KB/cs/csharpcasts.aspx είναι παραπλανητική, διότι δεν εξηγεί τι είναι μέτρηση.

Η κατώτατη γραμμή είναι:

  • Αν περιμένετε το cast να πετύχει (δηλαδή μια αποτυχία θα ήταν εξαιρετικό), χρησιμοποιήστε ένα καστ.

  • Αν δεν ξέρετε αν θα πετύχει, χρησιμοποιήστε το «ως» φορέας εκμετάλλευσης και να δοκιμάσει το αποτέλεσμα για μηδενική.

Απαντήθηκε 16/09/2008 στις 20:21
πηγή χρήστη

ψήφοι
5

Μια διαφορά μεταξύ των δύο προσεγγίσεων είναι ότι η η πρώτη ((SomeClass) obj) μπορεί να προκαλέσει ένα μετατροπέα τύπου για να κληθεί.

Απαντήθηκε 08/11/2008 στις 00:46
πηγή χρήστη

ψήφοι
4

Λοιπόν το «ως» φορέας εκμετάλλευσης «βοηθάει» θα θάψει το πρόβλημά σας τρόπο κάτω γιατί όταν παρέχεται ένα μη συμβατό παράδειγμα, θα επιστρέψει null, ίσως θα περάσει ότι σε μια μέθοδο η οποία θα περάσει σε ένα άλλο και ούτω καθεξής και, τέλος, σας» ll να πάρετε μια NullReferenceException που θα κάνουν τον εντοπισμό σφαλμάτων σας πιο δύσκολη.

Μην κατάχρηση. Η άμεση τελεστής cast είναι καλύτερη στο 99% των περιπτώσεων.

Απαντήθηκε 28/10/2010 στις 10:21
πηγή χρήστη

ψήφοι
4

Εδώ είναι ένας καλός τρόπος για να θυμόμαστε τη διαδικασία που το καθένα από αυτά συνάγεται ότι μπορώ να χρησιμοποιήσω όταν προσπαθείτε να αποφασίσετε ποια είναι η καλύτερη για την περίπτωση μου.

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

και το επόμενο θα πρέπει να είναι εύκολο να μαντέψει κανείς τι κάνει

DateTime i = value as DateTime;

στην πρώτη περίπτωση, εάν η αξία δεν μπορεί να ρίχνει από μια εξαίρεση στη δεύτερη περίπτωση, εάν η αξία δεν μπορεί να πετάξει, i έχει οριστεί σε τιμή null.

Έτσι, στην πρώτη περίπτωση μια σκληρή στάση γίνεται αν το καστ αποτύχει στη δεύτερη ρίχνει ένα μαλακό στάση γίνεται και που ενδέχεται να αντιμετωπίσετε ένα NullReferenceException αργότερα.

Απαντήθηκε 05/08/2008 στις 18:46
πηγή χρήστη

ψήφοι
3

Για να επεκταθώ σε σχόλιο Rytmis του , δεν μπορείτε να χρησιμοποιήσετε το ως λέξη-κλειδί για Δομές (Τύποι Value), καθώς δεν έχουν μηδενική αξία.

Απαντήθηκε 07/09/2008 στις 09:08
πηγή χρήστη

ψήφοι
2

Όλα αυτά ισχύουν για την αναφορά τύπων, είδη αξία δεν μπορεί να χρησιμοποιήσει τη asλέξη-κλειδί, καθώς δεν μπορεί να είναι null.

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

Η σύνταξη καστ είναι πιο γρήγορη, αλλά μόνο όταν είναι επιτυχής, είναι πολύ πιο αργή για να αποτύχει.

Η βέλτιστη πρακτική είναι να χρησιμοποιήσετε asόταν δεν γνωρίζετε τον τύπο:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

Ωστόσο, αν είστε απόλυτα σίγουροι ότι someObjectείναι μια περίπτωση SomeClassστη συνέχεια χρησιμοποιήστε καστ.

Σε Καθαρά 2 ή παραπάνω γενόσημα φάρμακα σημαίνει ότι πολύ σπάνια χρειάζεται να έχουν μια un-δακτυλογραφημένο παράδειγμα μιας κατηγορίας αναφοράς, έτσι ώστε το τελευταίο λιγότερο συχνά χρησιμοποιούνται.

Απαντήθηκε 18/09/2008 στις 12:10
πηγή χρήστη

ψήφοι
1

Και για λόγους πληρότητας, Eric Lippert έχει ένα blog post σχετικά με τις διαφορές και ορισμένες επιφυλάξεις.

Απαντήθηκε 09/10/2009 στις 01:04
πηγή χρήστη

ψήφοι
1

Για όσους από εσάς με VB.NET εμπειρία, (τύπου) είναι το ίδιο με το DirectCast και «ως τύπος» είναι η ίδια όπως TryCast.

Απαντήθηκε 16/09/2008 στις 22:55
πηγή χρήστη

ψήφοι
1

Είναι σαν τη διαφορά μεταξύ Parse και TryParse. Μπορείτε να χρησιμοποιήσετε TryParse όταν περιμένεις μπορεί να αποτύχει, αλλά όταν έχεις ισχυρή διαβεβαίωση ότι δεν θα παραλείψει να χρησιμοποιήσετε Parse.

Απαντήθηκε 08/08/2008 στις 13:00
πηγή χρήστη

ψήφοι
1

Θα ρίξει διάφορες εξαιρέσεις.
(): NullReferenceException
όπως: InvalidCastException
Ποια θα μπορούσε να βοηθήσει για τον εντοπισμό σφαλμάτων.

Οι «ως» προσπάθειες λέξη-κλειδί για να ρίξει το αντικείμενο και αν το καστ αποτύχει, null επιστρέφεται σιωπηλά. Το () τελεστής cast θα ρίξει μια εξαίρεση αμέσως αν το καστ αποτύχει.

«Χρησιμοποιείτε μόνο το C #“και”λέξη-κλειδί, όπου σας περιμένει το καστ να αποτύχει σε ένα μη-εξαιρετική περίπτωση. Αν Βασιζόμαστε σε ένα cast για να πετύχει και είναι απροετοίμαστοι για να λαμβάνετε κάθε αντικείμενο που θα αποτύχει, θα πρέπει να χρησιμοποιήσετε το () ρίχνει χειριστή έτσι ώστε ένα κατάλληλο και χρήσιμο είναι εξαίρεση.»

Για παραδείγματα κώδικα και μια περαιτέρω εξήγηση: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Απαντήθηκε 05/08/2008 στις 16:49
πηγή χρήστη

ψήφοι
1

Η παρενθετική ρίχνει ρίχνει μια εξαίρεση, αν η προσπάθεια αποτύχει καστ. Η «ως» ρίχνει επιστρέφει null εάν η προσπάθεια αποτύχει καστ.

Απαντήθηκε 05/08/2008 στις 16:45
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more