2015-11-10 4 views
5

Betrachten Sie das folgende einfache Programm (Visual Studio 2015 verwenden):Struct und Klassenanzeigewert in Visual Studio Debug-Modus

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var dtClass = new MyDateTimeWrapperClass(DateTime.Today); 
     var dtStruct = new MyDateTimeWrapperStruct(DateTime.Today); 
     WriteLine(dtClass); 
     WriteLine(dtStruct); 
     ReadKey(); 
    } 
} 

public class MyDateTimeWrapperClass 
{ 
    private readonly DateTime _value; 

    public MyDateTimeWrapperClass(DateTime value) 
    { 
     _value = value; 
    } 

    public override string ToString() => _value.ToString("MM/dd/yyyy"); 
} 

public struct MyDateTimeWrapperStruct 
{ 
    private readonly DateTime _value; 

    public MyDateTimeWrapperStruct(DateTime value) 
    { 
     _value = value; 
    } 

    public override string ToString() => _value.ToString("MM/dd/yyyy"); 
} 

Die Konsole die erwartete Ausgabe der ToString Methode berichten. Im Debug-Modus ist die Ausgabe jedoch nicht identisch.

enter image description here

ich immer gedacht hatte, dass Visual Studio eine ToString() Aufruf verwendet diesen Wert anzuzeigen. Bei Strukturen scheint dies jedoch nicht der Fall zu sein. Kann jemand dieses Verhalten erklären? Ich würde die Antworten schätzen, die auch beschreiben, wie dieser Wert in erster Linie berechnet wird, da es scheint, dass mein Verständnis unvollständig ist.

Update: Weitere Informationen

  1. Dieses Problem tritt nicht, wenn ich Visual Studio 2013
  2. hartzucodieren die ToString Anrufe auf unterschiedliche Werte ergibt ein normales Verhalten.
+0

Was ist anders an der Ausgabe? – GrandMasterFlush

+1

@GrandMasterFlush Man druckt das Datum, man druckt Datum und Uhrzeit. –

+0

Ich hätte das selbe gesetzt, Debugger ruft toString() auf, um Wert anzuzeigen. Können Sie versuchen, jede WriteLine zu vermeiden und eine Ausnahme in die ToString() -Methode der Struktur einzufügen? Was passiert im Debugger? –

Antwort

1

Nicht sicher WARUM - aber die DebuggerDisplayAttribute könnte für diesen Zweck verwendet werden:

https://msdn.microsoft.com/en-us/library/ms228992(v=vs.110).aspx < Anleitung zur Verwendung von https://msdn.microsoft.com/en-us/library/x810d419.aspx < Typen Serien kann es wie folgt

Etwas angewendet werden funktionieren würde:

[DebuggerDisplay("{ToString()}")] 
public struct MyDateTimeWrapperStruct 
{ 
    private readonly DateTime _value; 

    public MyDateTimeWrapperStruct(DateTime value) 
    { 
     _value = value; 
    } 

    public override string ToString() => _value.ToString("MM/dd/yyyy"); 
} 

Verwenden Sie die nachfolgende Anführungszeichen zu entfernen:

[DebuggerDisplay("{ToString(),nq}")] 
+0

Danke Chris! Dies ist sehr hilfreich und interessant. Da es bei meiner Frage nicht darum geht, wie dieses Verhalten aufhört, sondern das Verhalten selbst zu verstehen, habe ich mich entschieden, dies nicht als Antwort zu markieren. –

+0

NP - froh, dass Sie es hilfreich fanden. Ich wäre auch daran interessiert zu wissen, warum. – Chris