Assegna un nome alle proprietà ValueTuple durante la creazione con new

So di poter denominare i parametri quando creo una tupla implicitamente simile a:

var me = (age: 21, favoriteFood: "Custard"); 

È ansible assegnare un nome ai parametri quando viene creata una tupla in modo esplicito? vale a dire

 var me = new ValueTuple(21, "Custard"); 

No, non puoi. I tipi ValueTuple sono in realtà indipendenti dal supporto campo denominato in C #. Quest’ultimo funziona più come proprietà denominate per i tipi anonimi. Cioè, il compilatore analizza il codice e genera degli alias per i membri appropriati in base alle dichiarazioni e agli usi. È attraverso il compito che il compilatore apprende i nomi dei campi. Poiché la syntax di base del costruttore non fornisce un meccanismo per denominare i campi, non è ansible utilizzarlo per generare direttamente una tupla con campi denominati.

Naturalmente, ci sono modi per reinterpretare il valore restituito dalla syntax del costruttore, per assegnare nomi a quel valore restituito. Presumo che tu sia a conoscenza di questo approccio e cerchi qualcosa di più diretto.

Come esempio di cosa intendo per “reinterpretare”, potresti fare qualcosa del genere:

 static (int value, string text) ConvertToNamed((int value, string text) t) { return t; } 

quindi questo chiamerebbe i campi, in una nuova variabile:

 var t1 = new ValueTuple(21, "hello"); var t2 = ConvertToNamed(t1); 

La variabile t1 è bloccata con Item2 e Item2 . Ma il compilatore genererà implicitamente i nomi desiderati per la variabile t2 .

Forse un esempio migliore è quello in cui non è necessario il metodo aggiuntivo:

 (int value, string text) t = new ValueTuple(21, "hello"); 

Anche in questo caso, non si sta effettivamente nominando i campi nella syntax del costruttore, ma vengono reinterpretati dalla dichiarazione della variabile locale.

Questo probabilmente non è un limite serio. In uno scenario in cui si desidera avere un nome persistente e facilmente assegnato, è probabilmente meglio dichiarare un tipo definito dall’utente piuttosto che utilizzare comunque la syntax della tupla. Puoi anche scrivere decostruttori per i tipi definiti dall’utente, e dichiarare tipi come questo significa che i nomi sono cittadini di prima class quando si tratta di riflessioni, dynamic , ecc.

Non ci credo. Ecco i documenti che ho trovato su ValueTuple:

https://docs.microsoft.com/en-us/dotnet/api/system.valuetuple-7?view=netframework-4.7

Personalmente non ho usato il tipo ValueTuble. Ho usato la class Tuple prima in questo modo:

 var tuple = new Tuple(21, "Custard"); var number = tuple.Item1; var st = tuple.Item2; 

Tuttavia trovo di usare Tuples, specialmente quando passano attraverso i metodi per essere clunky. Dovendo sempre sapere cosa c’è in Item1 e Item2 ecc. Secondo i documenti ValueTuple, è usato allo stesso modo.

Non dovresti solo fare una class di quadro?

Ho usato il tipo anonimo che penso soddisfi le tue esigenze.

 var anyom = new { age = 21, favoriteFood = "Custard" }; number = anyom.age; st = anyom.favoriteFood;