2013-07-29 14 views
7

Perl ha la capacità di fare:Come assegnare ad un elenco di variabili in una dichiarazione

my ($a,$b,$c,$d) = foo(); 

dove foo restituisce 4 variabili, in contrasto con l'assegnazione di uno alla volta. C'è qualcosa di simile in C#?

+9

perché non fare una lezione per questo? –

+0

AFAIK no, ma come @ 491243 ha detto che è possibile utilizzare la classe – wudzik

+2

Solo interessante - quando questa funzione può essere utile? –

risposta

8

No, fondamentalmente. Opzioni:

object[] values = foo(); 
int a = (int)values[0]; 
string b = (string)values[1]; 
// etc 

o:

var result = foo(); 
// then access result.Something, result.SomethingElse etc 

o:

int a; 
string b; 
float c; // using different types to show worst case 
var d = foo(out a, out b, out c); // THIS WILL CONFUSE PEOPLE and is not a 
            // recommendation 
+0

@lazyberezovsky alla fine tutte queste cose sono modi per esprimere più valori in uscita da una funzione e assegnarli ai residenti al chiamante; il meccanismo * per quello (elenchi, ecc.) è i dettagli di implementazione –

+0

ottenuto grazie mille! – user2521358

+3

Se si enumerano opzioni errate, suppongo che si possa includere anche una 'Tupla ':: '. Ovviamente, C# punta gli utenti sulla seconda opzione: restituisce una classe significativa. – Kobi

1

Per le funzioni è necessario restituire o 1 oggetto o void. Ma puoi affrontare questo problema in diversi modi.

  1. È possibile creare una struttura di dati come ad esempio un struct o un class che conterrà a,b,c,d e restituire che, come ad esempio la funzione I dati data foo() conterranno a, b, c, d
  2. È possibile utilizzare la parola chiave out nel parametro della propria funzione, ad es. foo (out a, out b, out c, out d), ma i tuoi input variabili dovranno essere inizializzati. Maggiori informazioni qui. Vedi http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx
  3. È inoltre possibile utilizzare ref che è simile a out. Si veda http://msdn.microsoft.com/en-US/library/14akc2c7(v=vs.80).aspx
  4. Se a, b, c, d sono tutti dello stesso tipo si possono rendimento sotto forma di una raccolta come un arrray o un list come un altro membro ha sottolineato

Ricordo anche a seconda sul tipo che stai passando a strcut, gli oggetti che valuti possono essere passati come Value o Reference. Vedere http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

+0

Ad 4. ​​Matrice, lista o (preferibilmente) un 'IEnumerable' –

2

Tuple può essere un costrutto utile per questo.

public Tuple<int, string, double> Foo() { ... } 

allora si può fare:

var result = Foo(); 

int a = result.Item1; 
string b = result.Item2; 
double c = result.Item3; 

Questo è un retaggio della crescente influenza degli stili di programmazione funzionali su C#: la tupla è un costrutto fondamentale in molti linguaggi funzionali, e assiste notevolmente nella loro tipizzazione statica.

Problemi correlati