869 Stimmen

Direktes Gießen vs. "als"-Operator?

Betrachten Sie den folgenden Code:

void Handler(object o, EventArgs e)
{
   // I swear o is a string
   string s = (string)o; // 1
   //-OR-
   string s = o as string; // 2
   // -OR-
   string s = o.ToString(); // 3
}

Was ist der Unterschied zwischen den drei Arten von Güssen (okay, der dritte ist kein Guss, aber Sie verstehen die Absicht). Welche sollte bevorzugt werden?

4voto

Chris S Punkte 63542
string s = o as string; // 2

ist vorzuziehen, da so die Leistungseinbußen eines doppelten Gusses vermieden werden.

4voto

BornToCode Punkte 8577

Alle gegebenen Antworten sind gut, wenn ich etwas hinzufügen darf: Um die Methoden und Eigenschaften von Strings (z.B. ToLower) direkt zu verwenden, kann man nicht schreiben:

(string)o.ToLower(); // won't compile

können Sie nur schreiben:

((string)o).ToLower();

aber Sie könnten stattdessen schreiben:

(o as string).ToLower();

El as ist besser lesbar (zumindest meiner Meinung nach).

4voto

V. S. Punkte 944

Ich möchte die Aufmerksamkeit auf die folgenden Besonderheiten des Programms lenken als Betreiber:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as

Beachten Sie, dass der as-Operator nur Referenzkonvertierungen durchführt, Nullable-Konvertierungen und Boxing-Konvertierungen durchführt. Der as-Operator kann nicht andere Konvertierungen durchführen, wie z. B. benutzerdefinierte Konvertierungen, die sollten stattdessen mit Cast-Ausdrücken durchgeführt werden.

3voto

Dmitry Punkte 482

Direktguss verwenden string s = (string) o; wenn im logischen Kontext Ihrer Anwendung string ist der einzig gültige Typ. Mit diesem Ansatz erhalten Sie InvalidCastException und die Umsetzung des Grundsatzes der Ausfallsicher . Ihre Logik wird vor der Weitergabe des ungültigen Typs geschützt oder erhält eine NullReferenceException, wenn sie verwendet wird as Betreiber.

Wenn die Logik mehrere verschiedene Arten von Rollen erwartet string s = o as string; und überprüfen Sie es auf null oder verwenden is Betreiber.

Neue coole Funktion haben in C# 7.0 erschienen, um zu vereinfachen und zu überprüfen, ist ein Musterabgleich :

if(o is string s)
{
  // Use string variable s
}

or

switch (o)
{
  case int i:
     // Use int variable i
     break;
  case string s:
     // Use string variable s
     break;
 }

1voto

xtrem Punkte 1627

Wenn ich versuche, die Zeichenkettenrepräsentation von irgendetwas (eines beliebigen Typs) zu erhalten, das potenziell null sein könnte, bevorzuge ich die unten stehende Codezeile. Sie ist kompakt, ruft ToString() auf und behandelt Nullen korrekt. Wenn o null ist, wird s String.Empty enthalten.

String s = String.Concat(o);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X