645 Stimmen

Mehrere Werte an einen Methodenaufrufer zurückgeben

Ich habe die C++-Version dieser Frage aber ich habe es nicht wirklich verstanden.

Kann jemand bitte klar erklären, wenn es in C# getan werden kann, und wie?

0 Stimmen

Basierend auf der Antwort auf die erwähnte Frage, in C/C++ & vor dem Variablennamen bedeutet "pass by reference", mit Referenzparametern können Sie die Variable an die Funktion übergeben und ihren Wert innerhalb der Funktion ändern, in C# können Sie es mit ref / out Parametern tun

802voto

Francisco Noriega Punkte 12455

Seit der Veröffentlichung von C# 7 können Sie die neue Tuples-Syntax verwenden

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

die dann wie folgt verwendet werden könnte:

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

Sie können Ihren Elementen auch Namen geben (damit sie nicht "Item1", "Item2" usw. heißen). Sie können dies tun, indem Sie der Signatur oder den Rückgabemethoden einen Namen hinzufügen:

(string first, string middle, string last) LookupName(long id) // tuple elements have names

ou

return (first: first, middle: middle, last: last); // named tuple elements in a literal

Sie können auch dekonstruiert werden, was eine sehr schöne neue Funktion ist:

(string first, string middle, string last) = LookupName(id1); // deconstructing declaration

チェックする dieser Link um weitere Beispiele zu sehen, was getan werden kann :)

792voto

Hadas Punkte 9558

In C# 7 und höher, siehe diese Antwort .

In früheren Versionen können Sie .NET 4.0+'s Tupel :

Zum Beispiel:

public Tuple<int, int> GetMultipleValue()
{
     return Tuple.Create(1,2);
}

Tupel mit zwei Werten haben Item1 y Item2 als Eigenschaften.

284voto

Devrim Altınkurt Punkte 2699

Sie können drei verschiedene Möglichkeiten nutzen

1. ref / out Parameter

unter Verwendung von ref:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add = 0;
    int multiply = 0;
    Add_Multiply(a, b, ref add, ref multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, ref int add, ref int multiply)
{
    add = a + b;
    multiply = a * b;
}

ausnutzen:

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    int add;
    int multiply;
    Add_Multiply(a, b, out add, out multiply);
    Console.WriteLine(add);
    Console.WriteLine(multiply);
}

private static void Add_Multiply(int a, int b, out int add, out int multiply)
{
    add = a + b;
    multiply = a * b;
}

2. Struktur / Klasse

mit struct:

struct Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

Klasse verwenden:

class Result
{
    public int add;
    public int multiply;
}
static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.add);
    Console.WriteLine(result.multiply);
}

private static Result Add_Multiply(int a, int b)
{
    var result = new Result
    {
        add = a * b,
        multiply = a + b
    };
    return result;
}

3. Tupel

Tupel-Klasse

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    var result = Add_Multiply(a, b);
    Console.WriteLine(result.Item1);
    Console.WriteLine(result.Item2);
}

private static Tuple<int, int> Add_Multiply(int a, int b)
{
    var tuple = new Tuple<int, int>(a + b, a * b);
    return tuple;
}

C# 7 Tupel

static void Main(string[] args)
{
    int a = 10;
    int b = 20;
    (int a_plus_b, int a_mult_b) = Add_Multiply(a, b);
    Console.WriteLine(a_plus_b);
    Console.WriteLine(a_mult_b);
}

private static (int a_plus_b, int a_mult_b) Add_Multiply(int a, int b)
{
    return(a + b, a * b);
}

75voto

Samuel Punkte 36701

Dies ist in C# nicht möglich. Was Sie tun können, ist eine out Parameter oder geben Sie Ihre eigene Klasse (oder Struktur, wenn Sie wollen, dass sie unveränderlich ist) zurück.

Verwendung des Parameters out

public int GetDay(DateTime date, out string name)
{
  // ...
}

Benutzerdefinierte Klasse (oder Struktur) verwenden

public DayOfWeek GetDay(DateTime date)
{
  // ...
}

public class DayOfWeek
{
  public int Day { get; set; }
  public string Name { get; set; }
}

65voto

Keith Punkte 141163

In C#7 gibt es eine neue Tuple Syntax:

static (string foo, int bar) GetTuple()
{
    return ("hello", 5);
}

Sie können dies als Datensatz zurückgeben:

var result = GetTuple();
var foo = result.foo
// foo == "hello"

Sie können auch die neue Dekonstruktionssyntax verwenden:

(string foo) = GetTuple();
// foo == "hello"

Seien Sie jedoch vorsichtig mit der Serialisierung, all dies ist syntaktischer Zucker - im tatsächlichen kompilierten Code wird dies ein Tuple<string, int> (als gemäß der akzeptierten Antwort ) mit Item1 y Item2 anstelle von foo y bar . Das bedeutet, dass bei der Serialisierung (oder Deserialisierung) stattdessen diese Eigenschaftsnamen verwendet werden.

Deklarieren Sie also für die Serialisierung eine Record-Klasse und geben Sie stattdessen diese zurück.

Ebenfalls neu in C#7 ist eine verbesserte Syntax für out Parameter. Sie können nun die out inline, was in manchen Kontexten besser geeignet ist:

if(int.TryParse("123", out int result)) {
    // Do something with result
}

Meistens werden Sie dies jedoch in den .NET-eigenen Bibliotheken und nicht in Ihren eigenen Funktionen verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X