Concettualmente, KeyValuePair<TKey,TValue>
è solo una coppia di variabili, Key
e Value
. Aveva Microsoft ha implementato con campi esposti pubblici Key
e Value
, la semantica di essa sarebbe stato perfetto; se usato come variabile di controllo ForEach
sarebbe stato immutabile, ma si sarebbe potuto aggiornare il campo Chiave o Valore di una variabile ordinaria o di un elemento dell'array senza dover aggiornare l'altro.
Purtroppo, Microsoft sembra essere stato disposto a avere tipi quadro espongono i campi pubblici, anche per tipi come KeyValuePair<TKey,TValue>
o Drawing.Rectangle
cui semantica impongono che (1) il tipo deve essere una struttura; (2) il suo intero stato è visibile in un insieme fisso di proprietà (potrebbero esserci altre proprietà calcolate oltre a quelle che definiscono lo stato di un oggetto), e (3) a quelle proprietà può essere assegnata qualsiasi combinazione di valori adatta per i loro tipi. Di conseguenza, Microsoft ha considerato solo le possibilità di esporre i membri che comprendono lo stato dei tipi come proprietà di sola lettura o come proprietà di lettura-scrittura.Utilizzando le proprietà di lettura-scrittura vorrebbe dire che il codice come:
for each (var item in myDictionary)
item.Value += 1;
o
...assuming MyList is a List<Drawing.Rectangle>
MyList[3].Width += 9;
verrebbe interpretato dal compilatore C# esistenti sia come
for each (var item in myDictionary)
{ var temp = item; temp .Value += 1; }
o
...assuming MyList is a List<Drawing.Rectangle>
{ temp = MyList[3]; temp.Width += 9; }
entrambi comportano un comportamento orribile vior che non è quasi certamente ciò che il programmatore intendeva. Gli esecutori di .net hanno deciso che il valore di avere i membri di KeyValuePair<TKey,TValue>
individualmente mutabili non giustificava il pericolo posto dal primo, ma l'utilità di modificare i singoli membri di Rectangle
era sufficiente a giustificare il pericolo posto dal secondo. Nota che nessuno dei due esempi avrebbe dovuto rappresentare un pericolo se i tipi usassero campi esposti piuttosto che proprietà, dal momento che scrivere in un campo di una struttura temporanea non è mai stato permesso, anche quando si chiamavano i setter delle proprietà.
Suggerirei 'Tupla'. Il modo più semplice per crearne uno sarebbe 'Tuple.Create (existingValue.Key, existingValue.Value + 1)'. Sebbene la creazione di una classe, se logica, sarebbe meglio evitare inutili 'new()' s. – SimpleVar
@YoryeNathan: Sì, sarebbe probabilmente appropriato - o un tipo separato con nomi di proprietà che riflettono i significati reali di 'bool' e' int'. (Vedo che hai modificato il tuo commento anche per questo :) –
Sì, anche se posso immaginare casi in cui questo sarebbe usato in un piccolo ambito per qualche algoritmo bizzarro, nel qual caso preferirei personalmente un tipo anonimo. – SimpleVar