Ho letto la sezione 2.3.2 del libro di Skeet e, dalla mia comprensione, non esiste un riferimento vero in C#, come in C++.Leggi il capitolo di Jon Skeet sui riferimenti rispetto ai valori. Ancora confuso
E 'interessante notare che non solo è il bit "per riferimento" della mito innacurate, ma così è il "oggetti vengono passati" bit. Gli oggetti sono non inviati mai passati, per riferimento o per valore. Quando è coinvolto un tipo di riferimento , la variabile viene passata per riferimento oppure il valore dell'argomento (il riferimento) viene passato per valore.
Sede, che è diverso da C++ (Io vengo da un background C++), perché in C++ è possibile utilizzare la e commerciale utilizzare direttamente un oggetto in un elenco di parametri - nessuna copia di nulla, nemmeno una copia del indirizzo di memoria dell'oggetto:
bool isEven (int & i) { return i % 2 == 0 })
int main()
{
int x = 5;
std::cout << isEven(x); // is the exact same as if I had written
// std::cout (x % 2 == 0)
return 0;
}
Non esiste un equivalente di quanto sopra. Il meglio che si può ottenere in C# è un equivalente di
bool isEven (int * i) { return *i % 2 == 0 })
int main()
{
int x = 5;
std::cout << isEven(&x); // is like
// int * temp = &x;
// return *temp % 2 == 0;
// (garbage collect temp)
return 0;
}
che passa nel valore di una sorta di riferimento (un puntatore) e, naturalmente, è inutile nel mio esempio, perché tutto ciò che è stata passata in un piccolo primitivo (int
).
Da quello che ho capito, non esiste una sintassi C# che designi esplicitamente un elemento come riferimento, nessun equivalente dello &
nel mio esempio C++. L'unico modo per sapere se hai a che fare con un valore o riferimento è memorizzare i tipi di elementi che sono riferimenti quando vengono copiati e quali tipi sono valori. È come JavaScript in questo senso.
Si prega di criticare la mia comprensione di questo concetto.
Cosa c'è di sbagliato con il parametro 'ref'. modificatore? Inoltre, non penso che C++ funzioni nel modo in cui pensate di interpretare la spiegazione del primo snippet. Ciò che stai descrivendo è inlining. – leppie
@leppie Immagino di non averlo ancora imparato. Ops. – user5124106
@LarryPage "Memorizzare quali tipi di elementi sono riferimenti" in .NET è semplice, le classi sono "tipi di riferimento" e le strutture sono "tipi di valore". In un modo troppo semplificato, quando si passa una variabile che è un'istanza di una classe, si sta essenzialmente passando un riferimento a quell'istanza di una classe. Quando si passa una variabile che è un'istanza di una struct, si passa a una _copy_ di tale istanza. – jduncanator