English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C#7.0 (.NET Framework 4.7) ha introdotto la struttura ValueTuple, che è una rappresentazione tipo valore dei tuple.
ValueTuple è disponibile solo in .NET Framework 4.7. Se non vedi ValueTuple nel tuo progetto, è necessario installare ValueTuple. (.NET Framework 4.7 o versione successiva, o.NET Standard Library 2.0 o versione successiva include ValueTuple.)
Per installare il pacchetto ValueTuple, fai clic con il tasto destro sul progetto nell'esploratore di soluzioni e selezionaGestisci pacchetti NuGet...Questo aprirà il gestore pacchetti NuGet. Fai clic suEsplorascheda, digita ValueTuple nella casella di ricerca e selezionaSystem.ValueTuplepacchetto, come indicato di seguito.
Creare ed inizializzare un ValueTuple è facile. Puoi farlo utilizzando parentesi tonde () e specificare i valori al loro interno.
var person = (1, "Bill", "Gates"); //equivalente tuple //var person = Tuple.Create(1, "Bill", "Gates");"Bill", "Gates");
Può anche essere inizializzato ValueTuple specificando il tipo di ciascun elemento, come nel seguente esempio.
ValueTuple<int, string, string> person = (1, "Bill", "Gates"); person.Item1; // Restituisce 1 person.Item2; // Restituisce "Bill" person.Item3; // Restituisce "Gates"
Ecco un metodo abbreviato per dichiarare il tipo di ciascun membro.
(int, string, string) person = (1, "Bill", "Gates"); person.Item1; // Restituisce 1 person.Item2; // Restituisce "Bill" person.Item3; // Restituisce "Gates"
Attenzione, non abbiamo utilizzato var nella dichiarazione di inizializzazione di tuple sopra, ma abbiamo fornito il tipo di ogni membro tra parentesi quadre.
Un tuple deve avere almeno due valori. Esempi di casi non tuple:
var number = (1); // Tipo int, non tuple var numbers = (1,2); // Tuple valido
A differenza di Tuple, ValueTuple può contenere otto valori o più.
var numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
Possiamo assegnare nomi alle proprietà di ValueTuple invece di utilizzare i nomi di proprietà predefiniti come Item1, Item2 ecc.
(int Id, string FirstName, string LastName) person = (1, "Bill", "Gates"); person.Id; // Restituisce 1 person.FirstName; // Restituisce "Bill" person.LastName; // Restituisce "Gates"
Possiamo anche assegnare valori ai nomi dei membri di destra, come nel seguente esempio.
var person = (Id:1, FirstName:"Bill", LastName: "Gates");
Attenzione, possiamo fornire il nome del membro sia a sinistra che a destra, ma non su entrambi i lati. A sinistra ha la precedenza rispetto a destra. Il contenuto seguente ignorerà i nomi di destra.
// PersonId, FName, LName saranno ignorati. (int Id, string FirstName, string LastName) person = (PersonId:1, FName:"Bill", LName: "Gates"); // PersonId,FirstName,LastName将被忽略。它将具有默认名称:Item1,Item2,Item3。 (string, string, int) person = (PersonId:1, FName:"Bill", LName: "Gates");
我们还可以将变量分配为成员值。
string firstName = "Bill", lastName = "Gates"; var per = (FirstName: firstName, LastName: lastName);
以下方法返回ValueTuple。
static void Main(string[] args) { DisplayTuple(1, "Bill", "Gates"); } static void DisplayTuple((int, string, string) person) { Console.WriteLine($"Id = { person.Item1}"); Console.WriteLine($"First Name = { person.Item2}"); Console.WriteLine($"Last Name = { person.Item3}"); }
我们还可以为方法返回的 ValueTuple 指定不同的成员名称。
static void Main(string[] args) { var person = GetPerson(); } static (int, string, string) GetPerson()} { return (Id:1, FirstName: "Bill", LastName: "Gates"); }
可以通过解构 ValueTuple 来检索它的各个成员。解构声明语法将 ValueTuple 拆分为多个部分,并分别将这些部分分配给新变量。
static void Main(string[] args) { // 更改属性名称 (int PersonId, string FName, string LName) = GetPerson(); } static (int, string, string) GetPerson()} { return (Id:1, FirstName: "Bill", LastName: "Gates"); }
我们还可以使用 var 代替显式数据类型名称。
static void Main(string[] args) { // 使用var作为数据类型 (var PersonId, var FName, var LName) person = GetPerson(); } static (int, string, string) GetPerson()} { return (Id:1, FirstName: "Bill", LastName: "Gates"); }
ValueTuple permette anche di destrutturare membri non utilizzati con "discard".
// Utilizzare _ come discards per il membro non utilizzato LName (var id, var FName, _) = GetPerson();