2013-08-27 1 views
2

Je voulais juste obtenir des conseils sur le code ci-dessous. Essentiellement, je veux savoir pourquoi je peux instancier un objet et l'assigner à la variable newTask dans la classe et être capable de faire la même chose au même nom de variable newTask dans la méthode Button2Click?Durée de vie de l'objet (Classe et méthode)

public partial class MainForm : Form 
{ 
    TaskTypes.Task newTask = new TaskTypes.Task(); 

    void Button1Click(object sender, EventArgs e) 
    { 
     newTask.setName("Clean the toilet"); 
     textBox2.Text = newTask.getName(); 

    } 

    void Button2Click(object sender, EventArgs e) 
    { 
     newTask = new TaskTypes.Task("Why isnt this part failing?"); 
     textBox2.Text = newTask.getName(); 
    } ... 
+1

Ce sont les mêmes variables. Pourquoi ne seraient-ils pas? Vous n'avez déclaré qu'une seule variable (champ de membre de classe) –

+0

Si vous avez déclaré 'TaskTypes.Task newTask' dans' Button1Click', vous obtiendrez une erreur de compilation. Mais vous l'avez déclaré au niveau de la classe afin qu'il soit disponible pour toute méthode ou événement non statique dans la classe. –

+1

Autre chose à mentionner: si vous avez fait 'newTask'' readonly', vous ne pourrez pas le réassigner.Sauf, bien sûr, pour le constructeur de la classe. –

Répondre

3

Il y a deux concepts ici:

  1. Portée de la variable
  2. Référence mémoire

Avec la portée, tout est clair - la variable déclarée dans la classe est un membre de la classe et accessible de n'importe où dans la classe.

Maintenant, lorsque vous affectez une variable à une nouvelle instance d'un objet, cette variable contient une référence. Vous pouvez affecter de nouvelles instances autant de fois que vous le souhaitez. L'ancienne instance perdra la référence, donc, techniquement parlant, elle ne sera plus enracinée et sera disponible pour la récupération de place. Il existe des cas de variables en lecture seule (membres de la classe) qui ne peuvent être affectées qu'une seule fois.

Réponses supplémentaires:

Je pense que je suis vraiment confus entre une instance et un objet - instance = objet. En .net tout est un type. Tous les types dérivent du type "Object". Communément, tous les objets stockés dans la mémoire de tas appelés types de référence ou "objets". Les primitives stockées en pile appelées types-valeur.

1. L'objet est le TaskType - oui. TextBox également objet, à savoir - contrôle

2. J'ai créé une instance et passé la chaîne "nettoyer les toilettes" - oui. Instance- votre code chargé en mémoire.

3. La variable est newtask - oui

4. Je me suis alors attribué une nouvelle instance à la variable newtask - oui.

5. L'instance originale «nettoyer les toilettes» a-t-elle été recueillie par le ramasse-miettes? - pas immédiatement. Lorsque certaines conditions sont remplies pour l'exécution de garbage collector.

+0

Donc - Juste pour clarifier (je pense que je suis vraiment confus entre une instance et un objet). 1. L'objet est le TaskType 2. J'ai créé une instance et j'ai passé la chaîne "clean the toilet" 3. La variable est newTask 4. J'ai ensuite assigné une nouvelle instance à la variable newTask 5. L'instance d'origine "clean the toilet" a été collecté par le ramasse-miettes? – Alpotato

+0

Compris! Merci beaucoup :) – Alpotato

2

Ceci est appelé portée, elle définit où une variable est visible.

Vous utilisez la même variable déclarée, mais en utilisant l'instance de classe dans le premier clic, puis en utilisant une nouvelle instance dans le second clic sur le bouton.

+0

ah - compris, je vais relire les instances et les objets. (Merci) – Alpotato

+0

Portée et éligible pour la collecte des ordures ne sont pas les mêmes en C#. Un objet peut être collecté dès qu'il n'est plus accessible. Cela pourrait être très différent de la portée de la référence. –

+0

Merci d'avoir rattrapé Brian, je tapais trop vite et j'ai complètement perdu le fil de mes pensées. Mise à jour de la réponse –

0

Les variables déclarées dans une classe sont disponibles (ont une portée) pour tous les membres de cette classe.