2010-01-12 6 views

Antwort

10

Dies sind nicht alle Beispiele für das Gießen. Diese

ist ein gegossenes:

string someVariable = (string) someOtherVariable; 

Dies ist Call-Methode:

string someVariable = someOtherVariable.ToString(); 

Und das ist eine sichere Besetzung:

string someVariable = someOtherVariable as string; 

Die ersten und dritten Beispiele tatsächlichen Abgüsse sind . Die erste Besetzung hat die Möglichkeit, eine InvalidCastException zu werfen, während das dritte Beispiel diese Ausnahme nicht auslöst. Aus diesem Grund ist der Operator as als sicherer Cast bekannt.

+0

Wenn ich einigeOtherVariable nicht in eine Zeichenkette werfen kann, was wird dann ein sicherer Cast tun? – Deane

+3

@Deane: Es wird stattdessen null zurückgegeben. – rmac

+1

Es ist erwähnenswert, dass die 'ToString'-Methode grundsätzlich someOtherVariable anfordert, sich selbst als String darzustellen, und die Standardimplementierung (von Object geerbt) gibt einfach den Klassennamen zurück. Wie bei der "sicheren Besetzung" versucht "as", den Wert von someOtherVariable in eine strangförmige Box zu packen und lässt die Box leer, wenn sie nicht passt (dh einige Variablen sind null, wenn einigeOtherVariable nicht in a umgewandelt werden können Zeichenfolge). – Rory

0

Das ist 100% persönliche Präferenz hier, aber für mich ich das Folowing:

string someVariable = (string) someOtherVariable; 

Wenn ein Kind oder einen Elternteil Typ Umwandlung (zB NetworkStream-> Strom.)

string someVariable = someOtherVariable.ToString(); 

Bei der Konvertierung in einen neuen Typ (int -> string)

Und ich benutze nie die letztere (als String) -Methode, vor allem weil ich von einem C/C++ Hintergrund bevorzuge ich die() und es ist ein bisschen prägnanter.

+0

zu einem übergeordneten Typ Casting ist implizit so würde man selten muss in diesem Fall eine explizite Besetzung durchführen. Außerdem denke ich, dass "as" manchmal nützlich ist, wenn Sie gleichzeitig nach einem bestimmten Typ und null Instanzen suchen (da "as" null liefert, wenn das Objekt nicht vom angegebenen Typ ist). Ex. Sie haben möglicherweise eine Methode, die einen optionalen Parameter "sender" vom Typ object verwendet (um eine Schnittstellenanforderung zu erfüllen), aber Sie sind immer noch mit seinem Typ beschäftigt: Foo x = Absender als Foo; if (x! = null) x.Bar(); –

2

Das Schlüsselwort as ist sehr nützlich, wenn Sie der Meinung sind, dass die Konvertierung während eines Upcasts fehlschlägt. Zum Beispiel, wenn ich die gleiche Operation auf ähnliche Typen in einer Kontrollliste durchführen wollen ... sagen wir mal alle Ankreuzfelder unchecking:

foreach (Control ctrl in Controls) 
{ 
    Checkbox box = ctrl as Checkbox; 
    if (box != null) 
     box.Checked = false; 
} 

diese Weise, wenn meine Liste etwas anderes, wie ein Textfeld oder ein label, es wird keine Ausnahme ausgelöst (da die Variable einfach = null gesetzt wird, wenn sie fehlschlägt), und sie ist sehr effizient. Es gibt keinen Ausnahmeaufwand.

+0

Es ist auch schneller als eine Typprüfung dann Cast. –

0

Es gibt einen großen Unterschied zwischen Casting mit Klammern und Casting mit "as".

Im Grunde werden Klammern eine Ausnahme ausgelöst, während "as" null zurückgibt, anstatt eine Ausnahme auszulösen.

Detailliertere Informationen here

0
string someVariable = (string) someOtherVariable; 

dies Ihr guter alter normaler Casting ist, und es wird eine Ausnahme ausgelöst, wenn Sie versuchen, etwas in etwas werfen kann es nicht (so einige Male Sie, wenn sie überprüfen müssen gegossen werden gießbar ist)

string someVariable = someOtherVariable.ToString(); 

nicht wirklich Gießen ist, es ist ein Verfahren ausgeführt werden, die von verschiedenen Orten (Schnittstellen), sondern dass alle Objekte in C#, da sie aus dem Objekt-Objekt erben, die es hat kommen können.Es hat eine Standardoperation, die den Namen des Objekttyps angibt, aber Sie können es überladen, um zu drucken, was auch immer Ihre Klasse in der ToString-Methode drucken soll.

string someVariable = someOtherVariable as string; 

Dies ist ein neues C# Gießen, wird es zuerst, ob sie gießbar ist durch eine variable is string zunächst mit und dann das Gießen zu tun, wenn sie gültig ist oder null zurück, wenn dies nicht der Fall, so ist es ein stilles sein könnte Fehler, wenn Sie Ausnahmen erwarten, da Sie gegen Null überprüfen sollten.

Grundsätzlich

myType as myOtherType 

ist die gleiche wie:

var something = null; 
if(myType is myOtherType) 
{ 
    something = (myType) myotherType; 
} 

der Ausnahme, dass, wie in einem Schritt prüfen und gegossen werden, und nicht in 2.

2

Die Ideen von CAST und CONVERT sollte hier nicht verwechselt werden. Beim Casting wird ein Objekt so angezeigt, als wäre es ein anderer Typ. Beim Konvertieren wird ein Objekt in einen anderen Typ umgewandelt.

Wenn Sie eine Zeichenfolge mit CAST verknüpfen möchten, sollten Sie die erste oder dritte verwenden. (Die Option hängt davon ab, was in der Fehlerbedingung passieren soll. Siehe Antwort bangoker.)

Wenn Sie eine Zeichenfolge konvertieren möchten, sollten Sie die zweite verwenden. (Oder besser, ChaosPandion 's modifizierte Anweisung mit dem trinary-Operator.) Das ist, weil das Verhalten der ToString-Methode als Konvertieren des Objekts in eine Zeichenfolgendarstellung definiert ist.

5

Die drei machen verschiedene Dinge - keine sind "korrekter", es hängt von Ihrer Situation ab. Wenn Sie mehrere Objekte haben, bei denen es sich möglicherweise nicht um Strings handelt, verwenden Sie wahrscheinlich .ToString() (mit einem Null-Check, wenn Sie Nullen erwarten).

Wenn Sie nur für die Nicht-Null-Zeichenfolgen interessiert sind, aber dennoch Zeichenfolgen erwarten, verwenden Sie eine "as" -Ausführung und ignorieren Sie dann die Werte, die als null (ursprünglich Null oder eines Nicht-String-Typs)

Wenn Sie erwarten, nur Strings zu erhalten, ist es am besten, den (String-) Cast zu verwenden. Dies drückt die Absicht aus, die im Code am besten ist.

object foo = 5; 
string str = (string)foo; // exception 
string str = foo as string; // null 
string str = foo.ToString(); // "5" 

object foo = "bar"; 
string str = (string)foo; // "bar" 
string str = foo as string; // "bar" 
string str = foo.ToString(); // "bar" 

object foo = null; 
string str = (string)foo; // null 
string str = foo as string; // null 
string str = foo.ToString(); // exception 
0

Zunächst einmal sollten Sie avoid casting with AS operator. Der verlinkte Artikel erklärt warum.

Zweitens können Sie NUR ON-Operator verwenden, wenn Sie erwarten, dass der Wert nicht von dem Typ ist, den Sie auch werfen. Also müssen Sie das manuell überprüfen.

Auch der obj.ToString() Methodenaufruf ist kein Gießen, es wandelt Objekt in eine Zeichenfolge Darstellung (die im Fall einer Zeichenkette selbst die gleiche Zeichenfolge ist). Dies kann von jeder Klasse überwacht werden.


So in der Regel folgen ich dies:

  1. Immer (Type) Gießen verwenden.
  2. Verwenden Sie den Operator as nur, wenn das Objekt von einem anderen Typ sein kann als dem, in den Sie umgewandelt haben.
  3. Bei Verwendung as-Operator - IMMER das Ergebnis für NULL überprüfen.
  4. Verwenden Sie ToString nur in Fällen, in denen Sie Informationen über das Objekt anzeigen müssen.
+1

Verwenden Sie Ihren eigenen Blog als Bezugspunkt für eine Meinung ist nicht die beste Verteidigung. "as" und ein Null-Check ist schneller als eine Typüberprüfung dann Cast. –

+0

Ich argumentiere nicht, dass AS schneller ist. Ich sage, dass As + Null-Check immer durchgeführt werden sollte. In Wirklichkeit vergessen viele Entwickler einfach, nach Nullen zu suchen. Aus diesem Grund gibt es eine gute Praxis an Ort und Stelle - verwenden Sie explizite Casting (Klammern), die Typprüfung durchführen und beschreibenden Fehler werfen wird, wenn Typ-Cast fehlgeschlagen ist. –

6

Hier ist mein Artikel zu diesem Thema.

http://blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

Wie für die man „richtigste“ ist, dass die am meisten richtig ist derjenige, der bedeutet, dass Sie den Leser des Programms zu vermitteln beabsichtigt hat.

"ToString()" vermittelt "das ist wahrscheinlich keine Zeichenfolge; wenn es nicht ist, dann möchte ich von dem Objekt eine Zeichenfolge erhalten, die es darstellt."

Der "Cast" -Operator vermittelt entweder "das ist eine Zeichenfolge, und ich bin bereit, mein Programm zum Absturz zu bringen, wenn ich falsch liege", oder das Gegenteil, "dies ist keine Zeichenfolge und ich möchte einen Benutzer anrufen- definierte Konvertierung für dieses Objekt in String ".

Der "as" -Operator vermittelt "dies könnte eine Zeichenfolge sein und wenn nicht, möchte ich, dass das Ergebnis null ist."

Welches dieser vier Dinge meinst du?

0

Wenn Ihre Frage über die beste Praxis für die Syntax in eine Variable Gießen, dann lieber ich eine nächste verwenden:

var someVariable = someOtherVariable as string ?? string.Empty; 

Natürlich können Sie someVariableDefaultValue statt string.Empty verwenden.

Im Fall, wenn Sie nicht zu bespannen gegossen, sondern in den einigen komplexen Typ, dann nächste Syntax Ich empfehle, manchmal die Manövrierfähigkeit Operator genannt:

var complexVariable = otherComplexVariable as ComplexType; 
if (complexVariable?.IsCondition) 
{ 
    //your code if cast passed and IsCondition is true 
} 
else 
{ 
    //your code if cast not passed or IsCondition is false 
} 
Verwandte Themen