2010-04-16 33 views
11

Questa potrebbe essere una domanda doppia. Ma non è stato possibile trovare nella ricerca In java per contrassegnare un parametro di metodo come costante, dichiariamo come finale cosa è la parola chiave C# equivalente? ComePassare il parametro come finale in C#

public void doSomeThing(final object myObject) 
{ 
//print myobject 
} 
+0

perché non provate con la parola chiave const – KhanS

+1

@KahnS - perché l'utilizzo di tale parametro non verrà nemmeno compilato. – Oded

+0

Se mi chiedessero quale caratteristica del C++ mi manca di più in C#, sarebbero cost metodi e parametri. – Gorpik

risposta

7

Questo non è possibile in C# - non v'è alcun modo per segnare un passato nel parametro come costante.

Se si dispone di un const che deve essere disponibile per molte funzioni, perché non dichiararlo con l'ambito corretto (ambito della classe o globale se necessario)?

+5

@Oded L'intenzione principale di avere un parametro finale con il metodo è dichiararla come non modificabile all'interno del metodo. Non è che si stia facendo uso di un valore costante in essa. Questa parola chiave aiuta a progettare la struttura della parola chiave – Ravisha

3

non v'è nulla di simile in C#

1

C# contiene parole chiave di sola lettura, ma non può essere uset alle variabili locali (membri della classe unica). Ciò significa che non c'è modo di contrassegnare una costante di parametro metheod.

Mi manca anche perché nel mio codice Java quasi tutti i parametri e le variabili locali sono finali (che è un buon modello di codifica credo).

3

C'è una parola chiave readonly in C# ma finora possiamo applicarla solo ai campi, non ai locali o ai parametri.

Spesso in Java la parola chiave final viene utilizzata abitualmente come una questione di stile, per semplificare la chiusura dei valori nelle classi interne anonime. Ma quel problema non esiste in C# come metodi anonimi/lambda può chiudere le variabili modificabili.

Anche strumenti come Resharper possono visualizzare variabili/parametri mutati in un colore diverso, in modo da poter vedere le "complicazioni" nel metodo a colpo d'occhio. Lo uso per far risaltare i nomi mutati in grassetto verde o qualcosa del genere!

Questo non vuol dire che C# stesso non sarebbe migliorato da molte altre funzionalità come uno readonly ampiamente applicabile per aiutare con l'immutabilità dichiarata. Ma se hai metodi brevi e Resharper per evidenziare le cose per te, allora non hai bisogno di dichiarare manualmente le cose come final/readonly/const (a seconda della lingua). L'IDE ti tiene traccia di te.

Questo ha più senso: come hanno scoperto i codificatori Java, la maggior parte delle "variabili" non sono affatto variabili. Ma se devi dichiararlo aggiungendo final a tutto, c'è molto rumore di parole chiave extra nel tuo codice. Avrebbe più senso che il valore predefinito fosse final e che fosse necessario creare una parola chiave per rendere le cose mutable. Funziona così in F #.

+1

noise.Pleasssssse . Come accennato nel mio precedente commento a oded.It aiuta nella progettazione di framework. Se la regola che definisci nelle tue classi astratte come dovrebbe comportarsi, Se è un po 'extra @ il vantaggio di un buon progetto di design così sia. – Ravisha

+1

@Ravisha - Non sto dicendo "non farlo". È essenziale in Java consentire la chiusura da classi anonime. Sto dicendo * se * stavi progettando una lingua oggi, forse sceglieresti il ​​valore predefinito per l'opposto e invece avresti una parola chiave 'mutable'. È solo un senso comune rendere predefinito il caso comune e utilizzare una parola chiave per sovrascriverlo nei casi più rari. –

+0

Sembra che entrambi siano sulla stessa riga. Accetto di avere una parola chiave simile a mutabile – Ravisha

3

In C# 4.0/Visual Studio 2010 con il componente aggiuntivo Contratti di codice installato è possibile utilizzare Contract.Invariant in un attributo ContractInvariantMethod per verificare che un valore non venga modificato durante una chiamata di metodo.

Non proprio la stessa cosa, ma il più vicino possibile.

1

Come altri hanno affermato, non c'è niente di simile in C#.

Se la vostra intenzione è quella di vietare l'chiamato metodo per modificare l'oggetto (o so per certo che non), l'unica opzione è quella di passare una profonda clone del vostro oggetto. - Non molto elegante, ma l'unico modo possibile per essere sicuro.

Problemi correlati