Fondamentalement, j'aimerais pouvoir avoir une référence à une variable à l'intérieur d'une instance d'une classe, mais je voudrais que la référence devienne une variable de classe, donc je n'ai pas besoin de l'envoyer autour de la classe comme paramètre
code: p> Pourquoi je demande que cela est parce que je travaille avec WinForms et que je dispose d'une forme principale d'une classe à une nouvelle forme qui devrait éditer la classe et l'envoyer en arrière > Xxx pré> Comment puis-je résoudre ce problème? Je n'aime pas cette solution p> p>
6 Réponses :
Créer une classe contenant votre numéro en tant que propriété et transmettez-la sur votre logique. Cette classe représentera votre "modèle". P>
Vous ne pouvez pas enregistrer un paramètre et appelez-le: p> Vous devez créer une classe et utiliser cela dans votre logique. L'interface graphique ne devrait pas manipuler des valeurs, seul le backend doit. P> P> ref code>, un
ref code> n'est pas une référence, il ne s'agit que d'un
alias code>. Si vous avez:
ref code> signifie "faire i un alias pour s et propager le changement à celui-ci ". Une fois que vous avez quitté la portée de la méthode, cet alias est parti. Inciemment, Eric Lippert a lancé une série à propos de celui de son blog . p>
Couple de choses ici.
Tout d'abord, dans votre constructeur, vous voulez probablement faire au lieu de p> second, essayez p> au lieu de p>
J'ai ajouté le ref code> au poste;). Cela pourrait fonctionner pour la façon dont j'ai présenté le problème. Cependant, mon problème réside dans un winforms, donc je ne peux donc pas faire toutes les modifications au sein du constructeur comme je l'ai fait. Parce que le nouveau formulaire est dans un autre fil et j'ai besoin de garder cette référence en vie tout au long de la nouvelle forme
Ce n'est pas vraiment une bonne idée de ce que vous essayez de faire, j'exposerais l'objet modifié comme une propriété de la classe comme ci-dessous:
public class ClassContructorReference { static void Main(string[] args) { object var = new object(); MyClass myClass = new MyClass(var); StringBuilder mySb = myClass.Instance as StringBuilder; Console.WriteLine(mySb.ToString()); } } public class MyClass { public object Instance {get;set;} public MyClass(object var) { this.Instance = var; DoSomething(); } private void DoSomething() { this.Instance = new StringBuilder("Hello"); } }
J'aimerais pouvoir avoir une référence à une variable dans une instance d'une classe, mais j'aimerais que la référence devienne une variable de classe, donc je n'ai pas besoin de l'envoyer autour de la classe comme paramètre < / p> blockQuote>
Vous devrez vivre avec déception alors. Le système de type CLR interdit explicitement le stockage de références aux variables en tant que membres des classes. Le CLR permet des références aux variables à être p>
- transmis à des méthodes comme des arguments correspondant à des paramètres formels ou à "ceci" li>
- stocké en tant que locaux li>
- renvoyé comme méthode valide de retour li> ul>
mais pas em> permet de stocker le stockage dans les tableaux, les champs, etc. Fondamentalement, tout ce qui va "sur le tas" ne peut pas tenir une réf. P>
C # expose la première fonctionnalité: Refs aux variables comme paramètres de la méthode. Il n'expose pas les deux autres caractéristiques (bien que j'ai écrit une version expérimentale de C # qui fonctionne, et cela fonctionne assez bien.) P>
Notez que c # ne vous permet pas d'utiliser des réfs dans des contextes, ce qui nécessiterait un stockage de tas du paramètre réf - comme un paramètre Réf, une variable extérieure fermée d'une Lambda, par exemple. Il y a quelques cas rares dans lesquels le compilateur autorise ce qui ressemble à un stockage à long terme de la réfe et utilise la sémantique de copie-copie-copie pour imiter la Ref, mais probablement préférable de ne pas y aller. P >
Pourquoi le CLR a-t-il cette restriction? La bonne façon d'y penser est qu'il existe deux types de stockage: long terme et court terme, généralement appelé "tas" et "pile". Mais la forme de la structure de données n'est pas pertinente; Ce qui est pertinent est la durée de la vie. Une variable a un lieu de stockage; C'est ce qu'une variable est. Si vous pouviez conserver une référence vers une variable allouée à partir du stockage à court terme dans un stockage à long terme, le stockage à long terme conserve une référence à quelque chose qui est de toute la durée de vie plus courte, et donc peut se bloquer et mourir lorsqu'il accède à la variable Après sa mort. P>
évidemment, il existe de nombreuses façons de résoudre ce problème. Par exemple, l'équipe CLR aurait pu choisir de le rendre illégal de prendre une réfer à un stockage à court terme et de permettre le stockage des références dans le stockage à long terme. Mais cela signifie alors que vous ne pouvez pas prendre des références aux variables ou paramètres locaux, que vous souhaitez mettre au stockage à court terme car leur vie est si courte. p>
La manière dont l'équipe CLR a choisi réellement consistait à interdire le stockage à long terme de toute réf. Comme toute décision de conception, c'était le résultat de nombreux compromis contre des objectifs concurrents. P>
Bien sûr Votre code de test ne fonctionnera pas car il s'agit d'un type primitif.Mais votre 2e code fonctionnera car il s'agit d'un type de référence. (Même 'REF' n'est pas nécessaire) Pas besoin d'attribuer l'instance.
public class Second { public First f; public Second(First f) { this.f= f; } public void change() { this.f.Name = "PUli"; } } public class First { private string _name; public First() { Name = "SUli"; } public string Name { get { return _name; } set { _name = value; } } } class Program { static void Main(String[] args) { First f = new First(); Second sec = new Second(f); Console.WriteLine(f.Name); sec.change(); Console.WriteLine(f.Name); } }
Vos deux problèmes semblent complètement indépendants. Êtes-vous sûr que la solution au problème 1 vous aidera à résoudre le problème 2?
"Problème 2" est à quoi je résolve ce dilema ATM. En créant une copie de ce que je fais référence, puis lorsque j'ai fini de le modifier, le problème 1 Si je faisais "la classe de classe" et avant l'impression i ferait
num = myclass.classnumber code>
Étant donné que
instanceofclass code> est une référence, vous n'avez pas besoin d'utiliser
ref code> pour le transmettre (car vous souhaitez modifier le contenu i> de
instanceofclass code>, pas le pointeur lui-même). Je ne vois pas non plus pourquoi vous devez "saisir l'instance de retour" ... l'instanceOfclass et la classe Editedclass devraient toujours pointer sur le même objet en mémoire, non?