Casting: (NewType) vs. Objekt als NewType

stimmen
79

Mögliche Duplizieren:
Casting vs mit dem ‚wie‘ Schlüsselwort in den CLR

Was ist eigentlich der Unterschied zwischen diesen beiden Abgüsse?

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

Normalerweise sollten sie explizite Casts in den angegebenen Typ sein beides?

Veröffentlicht am 05/08/2008 um 16:42
quelle vom benutzer
In anderen Sprachen...                            


13 antworten

stimmen
82

Erstere wird eine Ausnahme ausgelöst, wenn der Quelltyp nicht in den Zieltyp umgewandelt werden kann. Letzteres wird in sc2 führt eine Nullreferenz zu sein, aber keine Ausnahme.

[Bearbeiten]

Meine ursprüngliche Antwort ist sicherlich der ausgeprägte Unterschied, aber wie Eric Lippert weist darauf hin , es ist nicht die einzige. Weitere Unterschiede sind:

  • Sie können nicht den ‚als‘ Operator verwenden, um eine Art zu werfen, die nicht ‚null‘ als Wert akzeptiert
  • Sie können nicht ‚als‘ verwenden , um konvertieren Dinge, wie Zahlen zu einer anderen Darstellung (float zu int, zum Beispiel).

Und schließlich mit ‚als‘ gegen den Rest des Cast-Operator, bist du auch sagen: „Ich bin nicht sicher, ob dies gelingen wird.“

Beantwortet am 05/08/2008 um 16:44
quelle vom benutzer

stimmen
27

Beachten Sie auch, dass Sie nur das als Schlüsselwort mit einem Referenztyp oder ein Nullable Type verwenden können

dh:

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

wird nicht kompiliert

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

kompilieren.

Beantwortet am 05/08/2008 um 17:15
quelle vom benutzer

stimmen
9

Typecasting mit „als“ natürlich viel schneller, wenn die Umwandlung fehlschlägt, da sie die Kosten des Werfens einer Ausnahme vermeidet.

Aber es ist nicht schneller , wenn die Umwandlung erfolgreich ist . Die Grafik http://www.codeproject.com/KB/cs/csharpcasts.aspx ist irreführend , weil es nicht erklären , was es messen.

Das Endergebnis ist:

  • Wenn Sie die Besetzung erfolgreich zu sein (dh ein Fehler wäre außergewöhnlich) erwarten, verwenden Sie eine Besetzung.

  • Wenn Sie nicht wissen, ob es gelingen wird, verwenden Sie den „als“ Operator und testen Sie das Ergebnis für null.

Beantwortet am 16/09/2008 um 20:21
quelle vom benutzer

stimmen
5

Ein Unterschied zwischen den beiden Ansätzen besteht darin , daß die die erste ((Someclass) obj) eine Ursache kann Wandler genannt werden.

Beantwortet am 08/11/2008 um 00:46
quelle vom benutzer

stimmen
4

Nun der ‚als‘ Operator „hilft“ begraben Sie Ihr Problem viel niedriger , weil , wenn es eine inkompatible Instanz zur Verfügung gestellt wird null zurück, vielleicht werden Sie , dass an eine Methode übergeben , die sie in einem anderen übergeben werden und so weiter , und Sie schließlich‘ ll erhalten eine Nullreferenceexception , die Ihre Debuggen schwieriger machen wird.

Missbrauchen Sie es nicht. Der direkte Cast-Operator ist besser, in 99% der Fälle.

Beantwortet am 28/10/2010 um 10:21
quelle vom benutzer

stimmen
4

Hier ist ein guter Weg, um den Prozess, den jeder von ihnen erinnern folgen, dass ich bei dem Versuch, zu entscheiden, welche für meine Situation besser ist.

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

und der nächste sollte leicht zu erraten, was es tut,

DateTime i = value as DateTime;

im ersten Fall, wenn der Wert nicht als eine Ausnahme geworfen werden kann, im zweiten Fall wird ausgelöst, wenn der Wert nicht gegossen werden kann, wird i auf null gesetzt.

So im ersten Fall ein harter Anschlag erfolgt, wenn die Besetzung in der zweiten Besetzung nicht ein Softstop gemacht wird und man könnte eine Nullreferenceexception später begegnen.

Beantwortet am 05/08/2008 um 18:46
quelle vom benutzer

stimmen
3

Zur Erweiterung auf Rytmis Kommentar , können Sie nicht die Verwendung als Schlüsselwort für structs (Werttypen), da sie keinen Nullwert haben.

Beantwortet am 07/09/2008 um 09:08
quelle vom benutzer

stimmen
2

All dies gilt das nicht Typen, Wertetypen verweisen können asSchlüsselwort , da sie nicht null sein kann.

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


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

Die gegossene Syntax ist schneller, aber nur wenn sie erfolgreich sind, ist es viel langsamer scheitern.

Am günstigsten ist es zu verwenden , aswenn Sie den Typ nicht kennen:

//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
}

Allerdings , wenn Sie absolut sicher sind, dass someObjecteine Instanz SomeClassdann gegossen verwenden.

In .Net 2 oder höher Generika bedeutet, dass Sie nur sehr selten eine nicht typisierten Instanz einer Referenzklasse haben müssen, so dass die letztere ist weniger häufig verwendet.

Beantwortet am 18/09/2008 um 12:10
quelle vom benutzer

stimmen
1

Und der Vollständigkeit halber, hat Eric Lippert einen Blog - Post über den Unterschied und einige Vorbehalte.

Beantwortet am 09/10/2009 um 01:04
quelle vom benutzer

stimmen
1

Für diejenigen von Ihnen mit VB.NET Erfahrung, (Typ) ist die gleiche wie Direct und „als Typ“ ist die gleiche wie TryCast.

Beantwortet am 16/09/2008 um 22:55
quelle vom benutzer

stimmen
1

Es ist wie der Unterschied zwischen Parse und TryParse. Sie verwenden TryParse, wenn Sie es vielleicht nicht erwarten, aber wenn man starke Gewissheit haben, wird es nicht Sie Parse verwenden scheitern.

Beantwortet am 08/08/2008 um 13:00
quelle vom benutzer

stimmen
1

Sie werden verschiedene Ausnahmen werfen.
(): Nullreferenceexception
als: InvalidCastException ,
die für das Debuggen helfen könnte.

Die „als“ Keyword-Versuche, das Objekt zu werfen, und wenn die Umwandlung fehlschlägt, null wird stillschweigend zurück. Der () Cast-Operator eine Ausnahme sofort ausgelöst, wenn die Umwandlung fehlschlägt.

als ‚Schlüsselwort„Nur die C #‘, wo Sie die Besetzung erwarten in einem Nicht-Ausnahmefall zum Scheitern verurteilt. Wenn Sie auf einem Guss zählen um erfolgreich zu sein und sind nicht darauf vorbereitet, jedes Objekt zu erhalten, die fehlschlagen würde, sollten Sie die () verwenden, Cast-Operator, so dass eine angemessene und hilfreiche Ausnahme ausgelöst.“

Codebeispiele und eine weitere Erklärung: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Beantwortet am 05/08/2008 um 16:49
quelle vom benutzer

stimmen
1

Die eingeklammerten Guss löst eine Ausnahme, wenn der Gussversuch fehlschlägt. Das „wie“ cast gibt null zurück, wenn der Gussversuch fehlschlägt.

Beantwortet am 05/08/2008 um 16:45
quelle vom benutzer

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