2015-06-23 3 views
6
ist

Sagen wir, wir haben den folgenden Code.Was passiert, wenn Object.ToString aufgerufen wird, wenn der tatsächliche Typ String

var foo = "I am a string"; 
Object obj = foo; 
var bar = obj.ToString(); 

Was passiert eigentlich?

  1. Werfen Sie das Obj auf eine Zeichenfolge und ruft dann die ToString-Methode?
  2. Ruft die ToString-Methode für obj auf, die die Überschreibung von String ohne Casting darstellt?
  3. Etwas anderes?

Hexe eins ist besser zu tun?

  1. var bar = obj.ToString();
  2. var bar = (string)obj;
+1

Sie stellen 2 Fragen in einem einzigen Thema. –

+1

'ToString' wird von' string' überschrieben, also zu Ihrer ersten Frage, es ist die dritte Option, es findet kein Casting statt, aber 'string.ToString' wird aufgerufen. – DavidG

Antwort

2

1) Aus den Open-Source-Dotnet Quellen an https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/String.cs:

// Returns this string. 
public override String ToString() { 
    Contract.Ensures(Contract.Result<String>() != null); 
    Contract.EndContractBlock(); 
    return this; 
} 

Die Überschreibung this nur zurückgibt.

2) Ich würde einfach var bar = foo; anstelle der Besetzung oder .ToString() verwenden. Wenn Sie nur ein Objekt haben, dann wird ja .ToString() bevorzugt.

2

ToString ist eine Methode, in der Objektklasse definiert sind, die dann in jeder Klasse in den gesamten Rahmen vererbt wird.

Die ToString-Methode in der String-Klasse wurde mit einer Implementierung überschrieben, die sich einfach selbst zurückgibt. Es gibt also keinen Overhead beim Aufrufen von ToString() für ein String-Objekt.

Also, ich denke nicht, dass es etwas gibt, worüber man sich Sorgen machen muss.

Auch würde ich mit der ersten Option gehen. Es ist lesbarer, und Sie sollten immer ein Ergebnis erhalten, egal welcher Typ "obj" ist.

+4

Sie müssen nicht wetten, wenn die [Quelle] (http://referencesource.microsoft.com/#mscorlib/system/string.cs2758) verfügbar ist. Auch Ihr ALWAYS kann ein bisschen zu stark sein - Sie * können * eine 'NullReferenceException' anstelle eines Ergebnisses erhalten. –

+0

Sie haben Recht. Ich habe meine Antwort aktualisiert. –

+0

Nur in dekompilieren suchen oyu kann eine Zeile Code in der String-Implementierung sehen: zurückgeben; –

0

Was passiert eigentlich?

Ihr Code kann tatsächlich so etwas wie dieses

var foo = new String("I am a string".ToCharArray()); 
Object obj = foo; 
var bar = obj.ToString(); 

C# sein string Schlüsselwort ein Alias ​​für String Klasse. Die ToString-Methode, die Sie aufgerufen haben, verwendet einfach den Polymorphismus-Mechanismus, um die richtige ToString-Implementierung aufzurufen. Wie Sie string wissen können, ist ein Referenz-Typ und ein Kind Klasse von Object

Hexe besser ist zu tun?

Von this beantworten.

Die beiden sind für verschiedene Zwecke gedacht. Die ToString-Methode von jedes Objekt soll eine Zeichenfolgendarstellung dieses Objekts zurückgeben. Casting ist ganz anders, und das "as" -Schlüsselwort führt, wie gesagt wurde, eine bedingte Besetzung durch. Das 'as' Schlüsselwort sagt im Grunde "erhalten Sie mir eine Referenz dieses Typs auf das Objekt, wenn dieses Objekt ist dieser Typ", während ToString sagt "Holen Sie sich eine Zeichenfolge Darstellung dieser Objekt". Das Ergebnis kann in einigen Fällen das gleiche sein, aber die beiden sollten niemals als austauschbar betrachtet werden, da sie, wie gesagt, für unterschiedliche Zwecke existieren: .Wenn Ihre Absicht ist zu casten, dann sollten Sie immer eine Besetzung verwenden, NICHT ToString.

Verwandte Themen