11
votes

C # Array de références

Comment puis-je faire quelque chose comme ça? XXX

EDIT:

Je tiens à le faire car ces variables sont accessibles directement par d'autres classes. Tels que V1 pourrait être la largeur de quelque chose et V2 pourrait être la hauteur de quelque chose. Certaines de mes classes utilisent la variable de largeur pour limiter la longueur de l'entrée qu'il doit obtenir de l'utilisateur. Certaines classes utilisent la variable de hauteur pour faire autre chose. Mais je veux pouvoir modifier ces variables à l'aide d'une boucle, car il s'agit actuellement de savoir comment le processus d'édition fonctionne: xxx

Je dois réaffecter manuellement les variables parce que je peux " T avoir une gamme de références à ces variables à utiliser dans une boucle. J'ai plus de 30 variables uniques que je dois faire cela pour et c'est une douleur.

Je suppose que le plan de secours serait de déplacer toutes ces variables dans un dictionnaire et d'avoir une matrice de toutes les clés et de toutes les touches chaque clé de la fonction d'édition.


4 commentaires

Pourquoi veux-tu faire cela? Vous ne pouvez pas passer le tableau et un index?


@Treetree: ça s'appelle int * ...


@Mehrdad: pensée créative. Cependant, comme vous le savez bien, il y a un certain nombre de mises en garde à la durée de vie du pointeur que je doute que l'OP est au courant de


Sauf si vous voulez descendre dans le dangereux Inferno, vous ne pouvez pas. Pour être honnête, je ne vois pas pourquoi vous voudriez même, comme vous pouvez simplement utiliser le tableau pour contenir v1 à travers v4 et rien de bizarre ne serait nécessaire.


3 Réponses :


5
votes

Non, vous ne pouvez pas.

Vous pouvez toujours modifier les éléments en place, mais uniquement en vous attribuant directement à eux: p> xxx pré>

mais je viens de tester ces travaux: P>

7
42


0 commentaires

2
votes

En supposant que vous avez vraiment do avez besoin de faire quelque chose comme ceci, je pense que le plus proche que vous puissiez obtenir sans utiliser de code dangereux consiste à modifier votre code pour ajouter un niveau d'indirection par Faire un petit porte-classe qui "contient" intens (ou tout T) xxx


2 commentaires

Nous avons eu la même idée, cependant, ma version contient des conversions implicites et un transfert de gethashcode et de totring en tant que début de la fabrication de choses transparentes :)


Je suggérerais que la valeur devrait être un champ plutôt qu'une propriété. Alors que la plupart des champs des classes représentent des détails de mise en œuvre qui ne doivent pas être exposés au client, je suggérerais que tout but d'un support pour maintenir et exposer sa valeur , beaucoup comme un tableau expose ses éléments. L'exposition du champ ne contrainte pas de manière significative la conception de la classe, mais l'enveloppant dans une propriété empêche de faire des choses utiles telles que l'un ou l'autre mypointholder.value.x + = 3; ou filetage .Interlocked.incrètent (refondu referfr.Value); .



0
votes

La méthode initializeAll code> de cette classe fonctionne à l'aide d'expressions et de réflexion LINQ. C'est la même intention que le code que vous voulez, je pense. Il initialise V1, V2, V3 et V4 à 0, 1, 2 et 3 respectivement.

using System;
using System.Linq.Expressions;

namespace ArrayOfReferences
{
    public class InitializeMultipleVariables
    {
        int v1;
        int v2;
        int v3;
        int v4;

        public void InitializeAll()
        {
            Initialize(
                () => v1, 
                () => v2, 
                () => v3, 
                () => v4);
        }

        public void Initialize(params Expression<Func<int>>[] intExpressions)
        {
            for (int i = 0; i < intExpressions.Length; i++)
            {
                var expr = intExpressions[i].Body as System.Linq.Expressions.MemberExpression;                
                var fieldInfo = this.GetType().GetField(expr.Member.Name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                fieldInfo.SetValue(this, i);
            }
        }
    }
}


0 commentaires