2013-07-29 8 views
7

Perl hat die Fähigkeit zuweisen zu tun: im GegensatzWie zu einer Liste von Variablen in einer Anweisung

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

wo foo kehren 4 Variablen, um sie einen nach dem anderen zugewiesen wird. Gibt es in C# etwas Ähnliches?

+9

Warum nicht eine Klasse dafür machen? –

+0

AFAIK nein, aber als @ 491243 sagte, Sie können Klasse – wudzik

+2

verwenden Nur interessant - wenn diese Funktion nützlich sein kann? –

Antwort

8

Nein, im Grunde genommen. Optionen:

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

oder:

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

oder:

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 letztlich alle diese Dinge sind Möglichkeiten, mehrere Werte outbound von einer Funktion auszudrücken, und sie an den Anrufer Einheimischen zuweisen; der * Mechanismus * dafür (Listen, etc) ist die Implementierung Details –

+0

habe es vielen Dank! – user2521358

+3

Wenn Sie schlechte Optionen aufzählen, können Sie auch ein 'Tuple ' ':)' einschließen. Offensichtlich weist C# die Benutzer auf die zweite Option hin - eine sinnvolle Klasse zurückgeben. – Kobi

1

Für Funktionen müssen Sie entweder ein Objekt oder void zurückzukehren. Aber Sie können dieses Problem auf verschiedene Arten angehen.

  1. Sie können eine Datenstruktur wie zum Beispiel ein struct oder class erstellen, die a,b,c,d enthalten und zurück, dass als Funktion z data foo() Daten enthalten a, b, c, d
  2. Sie können das Schlüsselwort out im Parameter Ihrer Funktion verwenden, z. foo (out a, out b, out c, out d), aber Ihre Variableneingaben müssen initialisiert werden. Mehr Infos hier. Siehe http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx
  3. Sie können auch ref verwenden, die ähnlich wie out ist. Siehe http://msdn.microsoft.com/en-US/library/14akc2c7(v=vs.80).aspx
  4. Oder wenn a, b, c, d alle vom gleichen Typ sind, können Sie sie in Form einer Sammlung als arrray oder list als ein anderes Mitglied zurückzukehren, hat darauf hingewiesen,

Denken Sie auch daran, je auf dem Typ, den Sie strcut vs Objekte übergeben, die Sie Wert als Value oder Reference übergeben können. Siehe http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

+0

Ad 4. ​​Array, Liste oder (vorzugsweise) ein "IEnumerable" –

2

Tuple kann ein nützliches Konstrukt dafür sein.

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

Dann können Sie tun:

var result = Foo(); 

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

Dies ist ein Vermächtnis des zunehmenden Einflusses der funktionalen Programmierung Stile auf C# ist: ist das Tupel ein grundlegendes Konstrukt in vielen funktionalen Sprachen und unterstützt stark in ihrer statische Eingabe

Verwandte Themen