Il secondo esempio non funzionerà come credete, perché int non è un tipo di riferimento. Quando estrai il valore dal dizionario stai assegnando una nuova variabile in questo caso a
.
Il primo esempio viene compilato a questo:
d[0] = d[0] + 1;
Tuttavia il secondo esempio viene compilato a questo:
int a = d[0];
a++;
di elaborare su questo. Gli indicizzatori funzionano come proprietà e le proprietà sono funzioni getter/setter. In questo caso, d[0] =
chiamerà la proprietà setter dell'indicizzatore. d[0] + 1
chiamerà la proprietà getter dell'indicizzatore.
Un int non è un oggetto di riferimento. Il secondo esempio funzionerebbe con le classi, ma non con gli interi. Proprietà non restituisce un riferimento alla variabile neanche. Se modifichi il valore di ritorno dall'indicizzatore, modifichi una variabile completamente nuova e non quella effettivamente memorizzata nel dizionario. Ecco perché il primo esempio funziona come previsto, ma il secondo no.
Il primo esempio aggiorna nuovamente l'indicizzatore, a differenza del secondo.
Il secondo esempio funzionerebbe come il primo se lo faceste in questo modo.
int a = d[0];
a++;
d[0] = a;
Questo è più di un concetto per comprendere le proprietà e indicizzatori.
class MyArray<T>
{
private T[] array;
public MyArray(T[] _array)
{
array = _array;
}
public T this[int i]
{
get { return array[i];
set { array[i] = value; }
}
}
consideri ora la seguente per un array normale
int[] myArray = new int[] { 0, 1, 2, 3, 4 };
int a = myArray[2]; // index 2 is 1
// a is now 1
a++; // a is now 2
// myArray[2] is still 1
Il codice precedente è così, perché int non è un tipo di riferimento e indicizzatori non restituisce un riferimento in quanto non è passato da ref, ma come valore di ritorno della funzione normale.
Consideriamo ora il seguente per MyArray
var myArray = new MyArray<int>(new int[] { 0, 1, 2, 3, 4 });
int a = myArray[2]; // index 2 is 1
// a is now 1
a++; // a is now 2
// myArray[2] is still 1
Ti aspettavi myArray [2] per creare un riferimento a myArray [2]? Non dovresti. Lo stesso vale per Dictionary
Questa è l'indicizzatore per Dictionary
// System.Collections.Generic.Dictionary<TKey, TValue>
[__DynamicallyInvokable]
public TValue this[TKey key]
{
[__DynamicallyInvokable]
get
{
int num = this.FindEntry(key);
if (num >= 0)
{
return this.entries[num].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
set
{
this.Insert(key, value, false);
}
}
penso che dovrebbe essere ormai chiaro, il motivo per cui le prime opere di questo tipo fa e perché il secondo non troppo.
Forse d [0] ++, si traduce per d [0] = d [0] + 1? –
Il compilatore non risolve 'd [0] ++' a 'd [0] = d [0] + 1'? Lo spiegherebbe se così fosse. – Octopoid
Il dizionario __stores__ questi numeri interi. Puoi incrementarli e puoi estrarli. Niente di strano lì, davvero. - Sono __are__ tipi di valore, che significa qui, che non puoi creare riferimenti ad essi come sembra provare il tuo secondo esempio .. – TaW