2012-11-14 4 views
3

Je voudrais être en mesure d'attribuer des valeurs à la liste des objets sans les référencer directement:Possible de stocker des références aux objets dans la liste?

exemple Pseudo:

List<int> intList = new List<int> { 0 }; 
???? intPointer = ref intlist[0]; 

*intPointer = 1; // I know * isn't possible here, but it is what I'd like to do 

Console.WriteLine(intList[0]); 

et génèrerait 1. Je pense que ce n'est pas possible, mais je voulais juste m'assurer que je ne manquais de rien.

En outre, je ne cherche pas un exemple qui utilise unsafe, je suis curieux de savoir si cela est possible dans le code managé.

+0

Qu'entendez-vous par "sans les référencer directement"? – Groo

+0

Je voudrais savoir ce qu'il y a dans 'list [0]' par le biais d'une autre variable – afuzzyllama

+0

Donc, vous voulez des références à des éléments de tableau individuels? Voir [référence vs types de valeur] (http://www.albahari.com/valuevsreftypes.aspx) en C#. Un type de référence en C# (une instance de n'importe quelle 'class') est toujours passé par référence (* similaire * à un pointeur en C). Par contre, les types de valeur sont toujours ** copiés ** lorsqu'ils sont transmis. Donc, pour les types de valeur (comme 'int',' float', 'struct' et similaires), ce n'est pas possible. Mais si vous en faites une propriété d'un type de référence, vous pourrez obtenir une référence. – Groo

Répondre

9

C# n'a pas de concept de "ref local" (the CLR does though). Vous devrez donc envelopper les valeurs dans un type de référence que vous pouvez muter. Par exemple,

public class Ref<T> where T : struct 
{ 
    public T Value {get; set;} 
} 

List<Ref<int>> intRefList = new List<Ref<int>>(); 
var myIntRef = new Ref<int> { Value = 1 }; 
intRefList.Add(myIntRef); 

Console.WriteLine(myIntRef.Value);//1 

Console.WriteLine(intRefList[0].Value);//1 

myIntRef.Value = 2; 

Console.WriteLine(intRefList[0].Value);//2 
4

Non, cela n'est pas possible dans C#. C# ne supporte pas les références aux variables locales, ce qui inclut des références aux éléments des conteneurs locaux.

La seule façon d'obtenir une véritable référence en C# (qui est, pas une instance d'un type de référence, mais une référence réelle à une autre variable) est réalisé via le ref ou out mots-clés de paramètres. Ces mots-clés ne peuvent être utilisés avec aucune sorte de valeur indexée ou de propriété, qui inclut des éléments dans un List<>. Vous n'avez également aucun contrôle direct sur ces références: le compilateur effectue le déréférencement pour vous, dans les coulisses.

Fait intéressant, le CLR prend en charge ce type de référence; Si vous décompilez CIL en C#, vous verrez parfois des types comme int& qui sont des références à int. C# volontairement ne vous permet pas d'utiliser ces types directement dans votre code.

+0

+1 - aperçu intéressant. Merci! – afuzzyllama

Questions connexes