2009-03-09 11 views
13

Immaginate codifica qualcuno il seguente:compilatore C# Enhancement Suggerimento

string s = "SomeString"; 
s.ToUpper(); 

Sappiamo tutti che nell'esempio di cui sopra, la chiamata al metodo “ToUpper()” non ha senso perché la stringa restituita non viene gestita a tutti . Ma ancora, molte persone commettono questo errore e passano il tempo a cercare di risolvere il problema chiedendosi "Perché i caratteri della mia variabile 'non sono maiuscoli" ????

Quindi non sarebbe bello se ci fosse un attributo che potrebbe essere applicato al metodo "ToUpper()" che darebbe un errore del compilatore se l'oggetto di ritorno non viene gestito? Qualcosa di simile a quanto segue:

[MustHandleReturnValueAttribute] 
public string ToUpper() 
{ 
… 
} 

Se l'ordine per questo codice per compilare correttamente l'utente avrebbe dovuto gestire il valore di ritorno in questo modo:

string s = "SomeString"; 
string uppers = s.ToUpper(); 

Credo che questo renderebbe più cristallino che si deve gestire il valore restituito altrimenti non c'è nessun punto per chiamare quella funzione.

Nel caso dell'esempio di stringa questo potrebbe non essere un grosso problema, ma posso pensare ad altri motivi più validi per cui questo sarebbe utile.

Cosa ne pensate?

Grazie.

+0

L'ho già fatto, +1 –

+0

@Rene: punto valido, +1 – Codex

risposta

8

Si chiama un metodo per i suoi effetti collaterali, per il suo valore di ritorno o per entrambi? Le funzioni "pure" (che non hanno effetti e servono solo a calcolare un valore di ritorno) sarebbero buone da annotare in quanto tali, sia per eliminare il tipo di errore che descrivi, sia per consentire alcune ottimizzazioni/analisi potenziali. Forse tra altri 5 anni vedremo che succederà.

(Si noti che il compilatore F # avviserà ogni volta che implicitamente ignorare un valore di ritorno. La funzione di 'ignorare' può essere utilizzato quando si desidera ignorare in modo esplicito.)

+0

La generalizzazione della nozione di annotazioni di "purezza" sarebbe buona, perché in tal caso il compilatore potrebbe essere in grado di ottimizzare di più. Simile alla parola chiave const C++, davvero. – Thomas

+0

Inoltre, l'aggiunta di un'annotazione [Pure] risolverebbe i problemi di cui le persone parlano in basso dove chiamano le funzioni e non si preoccupano degli effetti collaterali. Presumo che sia quello che l'autore stava veramente facendo. – Mason

0

Almeno un avvertimento del compilatore sarebbe utile. Forse aggiungono qualcosa di simile per C# 4.0 (Design-By-Contract).

+0

Preferisco un avviso per un errore. Se stai solo lanciando un codice, non vorresti che questo ti impedisca di eseguire il codice, per esempio. – Andy

+0

La progettazione per contratto riguarda precondizioni, postcondizioni e invarianti. Non si tratta di impostare termini su come i valori restituiti possono/devono essere usati. –

0

Questo non garantisce per un avvertimento o pragma. Ci sono troppi posti in cui si intende scartare il risultato, e sarei piuttosto seccato nel ricevere un avvertimento/errore dal compilatore solo perché il metodo è stato decorato con un attributo dodge.

Questo tipo di "avviso" deve essere annotato nell'editor dell'IDE, come una piccola icona sul margine interno "Avviso: scartare il valore restituito" o simile.

2

Non sono sicuro che mi piaccia. Ho chiamato molti un metodo che restituisce un valore che ho scelto di non acquisire. Aggiungendo un qualche tipo di default (il compilatore genera un avviso quando un valore di ritorno non viene gestito) mi sembra sbagliato.

Sono d'accordo sul fatto che qualcosa lungo le linee suggerite potrebbe aiutare i nuovi programmatori, ma l'aggiunta di un attributo in questo punto del gioco riguarderà solo un numero molto piccolo di metodi relativi al grande corpo esistente. Lo stesso programmatore junior non riuscirà mai a risolvere il problema quando la maggior parte dei valori di ritorno non gestiti non viene contrassegnata dal compilatore.

Potrebbe essere bello tornare indietro quando i cavalli sono fuori dal fienile.

+0

Aggiungere un attributo sarebbe un po 'troppo, ma non vedo perché il compilatore non possa dare un avvertimento "Il codice non ha effetto". –

+0

Il problema per me è che stai prendendo un costrutto valido e facendolo generare un avviso. Sì, può essere fonte di confusione ma io uso metodi che restituiscono valori tutto il tempo senza acquisire il valore restituito. – andleer

+0

bool DoStuff() {doStuff(); se (successo) restituisce vero; restituisce falso; } Ora quando si chiama DoStuff() ci possono essere delle volte in cui non mi interessa il successo o il fallimento. Non c'è bisogno di controllare i risultati, anche se si pensa che vengano restituiti. Altre volte, certo, mi potrebbe interessare. – andleer

6

Se si dispone di Resharper, verranno evidenziate le cose come questa. Non posso raccomandare abbastanza resharper, ha un sacco di utili aggiunte IDE, specialmente riguardo al refactoring.

http://www.jetbrains.com/resharper/

1

mi piacerebbe realtà preferiscono un modo per segnalare una struttura o di classe come [Immutabile], e hanno questo gestito automaticamente (con un avvertimento) per i metodi chiamati senza usare i loro valori di ritorno su oggetti immutabili. Questo potrebbe anche proteggere l'oggetto dal compilatore dalle modifiche dopo la creazione.

Se l'oggetto è veramente un oggetto immutabile, non ci sarebbe davvero modo di gestirlo. Potrebbe anche essere utilizzato dai compilatori per individuare altri errori comuni.

Contrassegnare il metodo stesso mi sembra meno utile. Sono d'accordo con la maggior parte degli altri commenti a riguardo. Se l'oggetto è mutabile, chiamare un metodo potrebbe avere altri effetti collaterali, quindi il codice sopra potrebbe essere perfettamente valido.

1

Ho dei flashback per mettere (void) cast su tutte le chiamate printf() perché non riesco a far arrestare Lint sul valore di ritorno che viene ignorato.

Detto questo, sembra che questa funzionalità debba trovarsi in uno strumento di controllo del codice piuttosto che nel compilatore stesso.