J'ai une classe qui en a plusieurs lists. Le nom de cette classe est Trans. Je souhaite utiliser ces listes dans un autre formulaire , mais je ne peux pas l'appeler lists. Quand je crée un objet de la classe Trans, ses listes sont réinitialisées. Comment puis-je utiliser ces listes dans toutes les formes du projet?

class Trans
{
    public static List<string> name_list = new List<string>();
    public static List<string> family_list = new List<string>();
    public static List<string> phoneno_list = new List<string>();

    public  List<string> name_Sec_list { set { name_list = value; } get { return name_list; } }
    public  List<string> family_Sec_list { set { name_list = value; } get { return name_list; } }
    public  List<string> phoneno_Sec_list { set { name_list = value; } get { return name_list; } }
}

Et Form1

Trans data = new Trans();
data.name_Sec_list.Add(name.Text);
data.family_Sec_list.Add(name.Text);
data.phoneno_Sec_list.Add(name.Text);

Quand je suis sur Form2 et que je veux utiliser mes listes, je ne peux pas Je devrais donc créer un objet à partir de la classe Trans et ce travail créera des valeurs de liste null.

0
Mohammad Farrahi 27 janv. 2017 à 12:46

4 réponses

Meilleure réponse

Vous pouvez utiliser un motif singleton:

class Trans {

    private static Trans instance;

    private Trans() { }

    public static Trans Instance() {
        if (instance == null) {
            instance = new Trans();
        }
        return instance;
    }
    ...
}

Utilisez-le sous sa première forme:

Trans trans = Trans.Instance();
trans.name_Sec_list ....

Utilisez-le sous une seconde forme:

Trans trans = Trans.Instance();
trans.name_Sec_list ....
1
Kevin Wallis 27 janv. 2017 à 09:51

Vous avez déjà 3 listes statiques dans votre classe Trans, si vous voulez les utiliser, rendez-en d'autres également statiques:

public class Trans
{
    public static List<string> name_list = new List<string>();
    public static List<string> family_list = new List<string>();
    public static List<string> phoneno_list = new List<string>();

    public static List<string> name_Sec_list = new List<string>();
    public static List<string> family_Sec_list = new List<string>();
    public static List<string> phoneno_Sec_list = new List<string>();
}

Ensuite, partout où vous souhaitez utiliser ces listes, vous devez y accéder comme:

Trans.name_Sec_list.Add(name.Text);

Vous pouvez maintenant utiliser ces listes sous la forme de votre choix.

0
Markiian Benovskyi 27 janv. 2017 à 09:53

Utilisez simplement une classe statique

  public static class Trans
    {
        public static List<string> name_list = new List<string>();
        public static List<string> family_list = new List<string>();
        public static List<string> phoneno_list = new List<string>();
    }

Usage

Trans.name_list.Add(string);

Je mettrais la classe statique dans un projet séparé afin qu'elle puisse être référencée ailleurs si nécessaire. Mais seulement si nécessaire.

0
Wheels73 27 janv. 2017 à 09:54

Comme d'autres l'ont suggéré, une solution rapide pourrait être de rendre les propriétés statiques. Cependant, cela introduira probablement de nouveaux problèmes tels que la testabilité et viole les principes du code propre.

L'approche Singleton est déjà meilleure, car vous pourriez potentiellement la rendre configurable pour renvoyer un objet de test pour les tests unitaires. Cependant, obtenir le Singleton nécessite une méthode statique, qui peut à nouveau être appelée partout.

Ainsi, les propriétés statiques et les singletons augmenteront la probabilité du code Spaghetti. C'est parce que vous n'avez aucun contrôle sur qui peut accéder aux données et qui ne le peut pas.

Vous n'avez pas spécifié exactement le nombre de formulaires dont vous disposez, la manière dont ils sont ouverts, etc. donc je devrai faire des hypothèses.

La méthode principale pourrait ressembler à ceci:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var data = new Trans();
    var secondForm = new Form2 {Trans = data};
    var mainForm = new Form1 {SubForm = secondForm, Trans = data };
    Application.Run(mainForm);
}

Et j'ai modifié la classe Trans pour qu'elle ne contienne plus d'éléments statiques. J'ai également corrigé cette classe, car à mon humble avis, il y avait un problème de copier / coller. Il est probable que vous ayez introduit tous les éléments _Sec_ à des fins de test, donc ils peuvent probablement être supprimés (ils renvoient le même objet, ce qui ne résout aucun problème).

class Trans
{
    public List<string> name_list = new List<string>();
    public List<string> family_list = new List<string>();
    public List<string> phoneno_list = new List<string>();

    public List<string> name_Sec_list { set { name_list = value; } get { return name_list; } }
    public List<string> family_Sec_list { set { family_list = value; } get { return family_list; } }
    public List<string> phoneno_Sec_list { set { phoneno_list = value; } get { return phoneno_list; } }
}

Que voyez-vous ici?

  • les deux, Form1 et Form2 ont accès aux données, donc cela résout votre problème.
  • la méthode Main() contrôle qui obtient quelles données. Tous ceux qui ont besoin de ces données obtiennent les données.
  • Personne d'autre n'a accès aux données. Bien que tout le monde puisse new monter un Trans lui-même, ce serait juste vide.
  • Comme il n'y a plus rien static, vous pouvez utiliser en toute sécurité new instances de Trans pendant les tests unitaires sans aucun effet secondaire
  • Les formulaires ne créent pas eux-mêmes leurs dépendances. La dépendance est maintenant injectée dans le formulaire. Cela permet de le remplacer par un objet fictif avec un comportement de test défini dans un test unitaire. (Une autre question est de savoir si vous devez tester les interfaces utilisateur dans des tests unitaires, mais c'est un sujet différent).
1
Thomas Weller 27 janv. 2017 à 13:27