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?
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?
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 :)
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.
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);
}
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; }
}
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 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.
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