2013-08-13 15 views
10

Ok, quindi ho scritto questo programma fuori dall'esercizio di un libro di programmazione C# (sto cercando di imparare qui) e chiede "Sovrascrivere il metodo ToString() per restituire tutti i dati membri ".Override Metodo .ToString C#

Ho fatto correttamente? O ho appena scritto con successo il codice che compila ma non fa nulla. Qual è lo scopo di ToString?

Ho trascorso circa 30 minuti a guardare altri post su questo e non ho capito, Così ho deciso di fare questo.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication297 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     String name = "Stormtrooper"; 
     Employee s = new Employee(name); 
     Console.WriteLine("The type of hire is a {0}", s.Name); 
     Console.WriteLine("The identification number is {0}", s.Number); 
     Console.WriteLine("The date of hire is {0} ABY", s.Date); 
     Console.WriteLine("The standard galactic salary is...{0:C}", s.Salary); 

    } 

    class Employee 
    { 
     private string _name; 
     private string _number; 
     private int _date; 
     private int _salary; 
     public string Name 
     { 
      get 
      { 
       return _name; 
      } 
     } 

     public string Number 
     { 
      get 
      { 
       return _number; 
      } 
     } 

     public int Date 
     { 
      get 
      { 
       return _date; 
      } 
     } 
     public int Salary 
     { 
      get 
      { 
       return _salary; 
      } 
     } 
     public Employee(string n) 
     { 
      _name = n; 
      _number = "AA23TK421"; 
      _date = 4; 
      _salary = 800; 
     } 
    } 

    public override string ToString() 

    { 
     return "_name + _number + _date + _salary".ToString(); 
    } 
} 
} 
+2

Quindi, come si fa a capire il compito? Cosa pensi dovrebbe essere il suo risultato? – zerkms

+0

Qual è il risultato quando si esegue questo codice? –

+1

E perché dovresti preoccuparti di sovrascrivere '.ToString()'? (Come suggerimento: qual è il risultato di 'Console.WriteLine (" s = {0} ", s)'? Trovi utile quel risultato? Cosa renderebbe più utile il risultato?) –

risposta

25

Si sta restituendo una stringa che dice solo la frase _name + _number + _date + _salary.

Quello che probabilmente si voleva fare è costruire una stringa usando quei campi. Se si voleva tutti mushed insieme Concat avrebbe funzionato, ma sarebbe altamente illeggibile

public override string ToString() 
{ 
    return String.Concat(_name, _number, _date, _salary); 
} 

Tuttavia ciò che sarebbe meglio è quello di utilizzare Format e includere le etichette con i valori

public override string ToString() 
{ 
    return String.Format("Name:{0}, Number:{1}, Date:{2}, Salary:{3}",_name, _number, _date, _salary); 
} 

Se si sta utilizzando C# 6 o più recente è possibile utilizzare il seguente formato più pulito

public override string ToString() 
{ 
    return $"Name:{_name}, Number:{_number}, Date:{_date}, Salary:{_salary}"; 
} 

Qual è la stessa logica della precedente versione String.Format.

2

Piuttosto provare qualcosa di simile

public override string ToString() 
{ 
    return String.Format("Name : {0}, number {1}, date {2}, salary {3}",_name,_number,_date,_salary); 
} 

Ma NEADS di essere parte della classe

così

class Employee 
{ 
    private string _name; 
    private string _number; 
    private int _date; 
    private int _salary; 

    ..... 

    public override string ToString() 
    { 
     return String.Format("Name : {0}, number {1}, date {2}, salary {3}",_name,_number,_date,_salary); 
    } 
} 

Dai un'occhiata alla String.Format Method

Sostituisce ogni elemento di formato in una stringa specificata con il testo equivalente del valore di un oggetto corrispondente.

+0

O anche probabilmente 'String.Format()' – zerkms

+0

@zerkms, l'ho appena modificato. Includerà anche un link per l'OP. –

0

Si potrebbe provare a formattare l'output in un formato piacevole. (Non testato, però)

public override string ToString() 
{ 
    return string.Format("Name: {0} Number: {1:n0} Date: {2:yyyy-MM-dd} Salary: {3:n2}", _name, _number, _date, _salary); 
} 

ci sono un sacco di scopi sovrascrivere .ToString(), a seconda del contesto. per esempio,

  • alcuni sviluppatori piace avere ben formattata descrizione dell'oggetto quando si fa il debug, sovrascrivendo .ToString() consentirebbe loro di avere descrizione significativa con un po 'identificativo (ad esempio, l'identificazione di un oggetto);
  • Alcuni sviluppatori preferiscono inserire un codice di serializzazione nel metodo ToString();
  • Alcuni sviluppatori hanno persino inserito del codice di debug nel metodo .ToString(), anche se potrebbe non essere una buona pratica.

davvero in base al contesto delle vostre esigenze. potresti trovare alcune buone pratiche da seguire online - credi che ci siano molte risorse online.

5

La gente di motivo l'override del metodo ToString() è quello di avere una rappresentazione di stringa di default del vostro oggetto, di solito per la visualizzazione per l'utente o in un registro o una console, in questo modo:

Console.WriteLine(yourClassObject); 

Se non hanno la precedenza il ToString(), quindi la sua attuazione default è di restituire il nome completo del vostro oggetto, in questo modo:

YourNamespace.YourClassName 

cambiando l'attuazione ereditato (da System.Object), allora si può fare un nic er (leggi: più bella) la rappresentanza, in questo modo:

public override string ToString() 
{ 
    return String.Format("This instance of my object has the following: Name = {0}, Number = {1}, Date = {2}, Salary = ${3}", _name, _number, _date, _salary); 
} 
0

Se si utilizza C# 6 (o successiva) utilizzare il metodo nameof() per i nomi delle proprietà nella stringa nel caso in cui i nomi propery cambiano. Puoi anche usare la notazione $"" invece di usare string.Format().

Ad esempio:

public override string ToString() 
{ 
    return $"{nameof(Name)}: {_name}"; 
} 
0

Senza ToString overiding, se si è tentato di "ottenere" il valore della stringa di un impiegato, ad esempio,

var employee1= new Employee(); Console.WriteLine(employee1);

quello che si otterrebbe è:

ConsoleApplication1.Program + Employee

Che fornisce alcuna informazione per aiutarvi (o un UI) di visualizzazione delle informazioni rilevanti.

Io uso return _name + _number + _date + _salary; che per default è string,

o un più dettagliato

return "Name:" + _name + " Number:" + _number + " etc...";