2013-03-11 13 views
11

Mi chiedo se c'è un modo per ottenere un errore di compilazione per questo codice:è possibile disabilitare la chiamata implicita a ToString()?

var customer = new SomeCustomerClass(); 
Console.WriteLine("Customer address:" + customer); 

così sarò costretto a scrivere qualcosa del genere:

var customer = new SomeCustomerClass(); 
Console.WriteLine("Customer address:" + customer.FormatAddress()); 
Console.WriteLine("Customer accounts:" + customer.FormatAccounts()); 

Se "ToString" sarebbe essere un'interfaccia, potrei farlo usando un'implementazione esplicita dell'interfaccia nella mia classe.

Grazie.

+0

Non credo, ma è possibile sovrascrivere '.ToString()' nell'oggetto cliente e fornire la propria implementazione. – Tim

+0

Ricevo quello che chiedi, ma perché ne hai bisogno? – SpaceBison

risposta

11

Non c'è modo di impedire questo codice in fase di compilazione. Object.ToString è una parte del contratto pubblico di ogni oggetto e non ci sono modi per impedirne l'invocazione in fase di compilazione. In questo caso specifico il compilatore risolverà il + in String.Concat(object, object) e l'implementazione finirà con il richiamo di Object.ToString. Non c'è modo di cambiare questo. Il tuo percorso più semplice è quello di ignorare ToString e chiamarlo in FormatAddress

Si prega di non modificare ToString per lanciare un'eccezione come pochi altri suggeriscono. La maggior parte di .Net si aspetta che lo ToString esista e sia non-lancio. La modifica avrà molti effetti collaterali inattesi negativi per il tuo programma (compresa l'eliminazione dell'esperienza di debug per tali oggetti)

+1

ovviamente sostituirò se ho solo bisogno di un nome diverso :) Un cliente ha più campi (e intendo dire - MOLTO) "informazioni" che devono essere stampati, e manca ".FormatXXX" è piuttosto difficile da notare per sviluppatori, poi va al business e qualche volta anche loro lo perdono ... Grazie per la risposta, comunque. Ero sicuro al 99% che non si potesse fare, ma volevo ottenere una seconda opinione. – avs099

+1

E 'questo quello che vuoi veramente? Tostring è pensato per scopi di debug. Ho la sensazione che il tostring sia "abusato" per ottenere che l'oggetto si rappresenti in qualcosa per soddisfare un requisito. Se questo è il caso, non lo farei tbh – bas

+0

Potresti voler cambiare i metodi 'FormatX' in' ToXString' o 'ToString (X)' (dove 'X' si riferisce ad un tipo come' enum X {Address, Accounts} ' : un enum delle cose che potresti stampare), per aiutare gli sviluppatori a trovare i metodi corretti in modo più intuitivo (queste convenzioni sono usate in tipi built-in come 'DateTime' e' double' per formattare in determinati modi). –

9

È possibile ignorare ToString nella classe cliente e, se necessario, puoi chiamare il metodo FormatAddress.

public override string ToString() 
{ 
    return FormatAddress(); 
} 
Problemi correlati