In C# 4, c'è un buon modo per avere un parametro di uscita opzionale?Parametri di uscita opzionali
risposta
No.
per renderlo "optional", nel senso che non è necessario assegnare un valore nel metodo, è possibile utilizzare ref
.
Un parametro 'ref' è un caso d'uso molto diverso. Un parametro facoltativo passa in un valore specifico se il chiamante non ne specifica uno: con un parametro ref, il chiamante sta sempre specificando un valore, indipendentemente dal fatto che lo abbia specificato o meno. Il 'ref' punta sempre a una posizione di memoria valida, e una posizione di memoria valida contiene sempre _qualcosa_. Nella migliore delle ipotesi, questo è solo un valore magico senza il vantaggio di una specifica predefinita che dice "il valore predefinito è X". – danwyand
Sì, questa risposta non è un giudizio di progettazione, motivo per cui ho aggiunto il qualificatore "nel senso che". – codekaizen
Non proprio, anche se è sempre possibile sovraccaricare il metodo con un altro che non accetta il parametro di uscita.
qualsiasi idea su come gestire il parametro opzionale in modo più elegante di '{stringa dummy; return Foo (out dummy); } 'nel sovraccarico che non accetta il parametro di uscita? –
@Louis: No, probabilmente è quello che avrei fatto! – Cameron
Questo è un codice in più per la piastra della caldaia. – Brain2000
private object[] Func();
assegnare quante uscite opzionali desiderate nella matrice di oggetti di restituzione e quindi usarle! ma se vuoi dire qualcosa di uscita opzionale come
private void Func(out int optional1, out string optional2)
e quindi si chiama qualcosa come
Func(out i);
allora la risposta è no non puoi. anche C# e .NET framework hanno molte strutture dati molto flessibili come List
e Array
e possono essere utilizzate come parametro di output o come tipo restituito, quindi non è necessario implementare un modo per avere parametri di output opzionali.
Anche la decorazione dei parametri con OptionalAttribute non funziona. Per estendere il campione precedente, si otterrebbe qualcosa del tipo:
private void Func(
[Optional] out int optional1,
[Optional] out string optional2)
{ /* ... */ }
Si noti che quanto sopra verrà compilato (forse sfortunatamente). Tuttavia, il tentativo di compilare:
Func(out i);
non riuscirà a meno che non sia esplicitamente previsto un sovraccarico con una firma ad un parametro.
Per (teoricamente) rendere il lavoro di cui sopra è un problema significativo. Quando viene chiamato un metodo con un parametro facoltativo omesso, viene creato un frame di stack contenente i valori di tutti i parametri e i valori mancanti vengono semplicemente riempiti con i valori predefiniti specificati.
Tuttavia, un parametro "out" è un riferimento, non un valore. Se quel parametro è opzionale e non viene fornito, quale variabile farà riferimento? Il compilatore deve ancora applicare il requisito che il parametro "out" venga compilato prima di ogni ritorno normale dal metodo, poiché il compilatore non sa a priori quali (se esistono) parametri opzionali sono specificati da un chiamante. Ciò significa che un riferimento alla variabile fittizia da qualche parte dovrebbe essere passato in modo che il metodo abbia qualcosa da riempire. Gestire questo spazio variabile fittizio creerebbe un fastidioso mal di testa per lo scrittore del compilatore. Non sto dicendo che sarebbe impossibile elaborare i dettagli di come funzionerebbe, ma le implicazioni architettoniche sono abbastanza grandi che Microsoft ha comprensibilmente trasmesso questa funzione.
public class Dummy<T>
{
public T Value;
}
Quindi utilizzare functionDoSomething(out new Dummy<int>().Value
, dove int
potrebbe essere qualsiasi tipo.
- 1. più parametri opzionali funzione
- 2. Rubino parametri opzionali
- 3. Python parametri opzionali
- 4. \ newcommand/\ newenvironment - parametri opzionali
- 5. Web API parametri opzionali
- 6. Metodo Groovy con parametri opzionali
- 7. manipolazione parametri opzionali in javascript
- 8. instradamento webforms asp.net: parametri opzionali
- 9. Parametri multivalore opzionali in SSRS
- 10. Meno mixin con parametri opzionali
- 11. Metodo di sovrascrittura e parametri opzionali
- 12. Costruttore angolare 2 DI con parametri opzionali
- 13. Angolare 2 @ Parametri di uscita
- 14. Parametri di uscita con RhinoMocks
- 15. Parametri nominati e opzionali, e WCF
- 16. parametri con chiusure opzionali in swift
- 17. Rotaie 3 Percorso con più parametri opzionali
- 18. Come saltare i parametri opzionali in Scala?
- 19. evitando il tedio dei parametri opzionali
- 20. Come costruire un decoratore con parametri opzionali?
- 21. asp.net webapi: come passare i parametri opzionali?
- 22. parametri URL opzionali in AngularJs Resource
- 23. Parametri opzionali in Bash espressione regolare
- 24. parametri POST opzionali in Elixir Phoenix
- 25. C# 4.0, parametri e parametri opzionali non funzionano insieme
- 26. Contenitori di librerie standard con parametri di modello opzionali aggiuntivi?
- 27. Parametri opzionali del percorso in Backbone.js? (di nuovo)
- 28. risoluzione Metodo metodi di estensione con parametri opzionali
- 29. C#: l'override dei metodi con i parametri opzionali e parametri denominati: risultato imprevisto
- 30. Come gestire i parametri opzionali nella query SQL?
Non visualizzare alcun valore per tale funzione. Se hai mai ascoltato le sessioni dei compilatori di C# su PDC, vedrai che ogni cambiamento ha un significato. –
Non sono d'accordo sul fatto che non ci sia alcun valore in questa funzione. Se un metodo ha qualche logica in esso, BESIDE restituisce i dati tramite parametri esterni - Voglio essere in grado di chiamare questa logica, semplicemente non ho bisogno dell'output ... – Alex
Uso Int32.TryParse() per vedere se la stringa data può essere analizzata in un numero e, se possibile, a volte è tutto ciò che mi interessa. Quindi Jitbit ha ragione. –