web-dev-qa-db-fra.com

C # Comment utiliser get, set et use enums dans une classe

J'ai un programme où j'utilise les paramètres d'un magasin de classe. J'en ai besoin pour utiliser les fonctions set et get pour modifier et stocker les paramètres. J'ai essayé cela et je ne le fais pas fonctionner. Quelqu'un peut-il m'aider avec celui-ci?

    private enum _Difficulty { Easy, Normal, Hard };

    public void SetDifficulty(Difficulty)
    {
        _Difficulty = Difficulty;
    }

    public enum GetDifficulty()
    {
        return _Difficulty;
    }

N'y a-t-il aucun moyen d'utiliser enums dans une classe avec get et set?

J'ai également besoin de cela avec bool et int.

13
user3407591

Il y a plusieurs problèmes ici:

  • Votre énumération est privée, mais vos méthodes sont publiques. Par conséquent, vous ne pouvez pas faire en sorte que le type de retour de vos méthodes soit le type enum ou avoir des paramètres avec ce type
  • Votre méthode SetDifficulty a un paramètre juste Difficulty - est-ce censé être le nom ou le type du paramètre?
  • Votre méthode SetDifficulty essaie de définir type plutôt qu'un champ
  • Votre méthode GetDifficulty essaie d'utiliser enum comme type de retour, puis renvoie un type plutôt qu'un champ

Fondamentalement, vous semblez confus sur ce que votre déclaration enum déclare - ce n'est pas déclarer un champ, c'est déclarer un type (et spécifier ce que le nom les valeurs de ce type sont).

Je suppose que tu veux:

// Try not to use nested types unless there's a clear benefit.
public enum Difficulty { Easy, Normal, Hard }

public class Foo
{
    // Declares a property of *type* Difficulty, and with a *name* of Difficulty
    public Difficulty Difficulty { get; set; }
}

Vous pouvez utiliser les méthodes get/set si vous voulez vraiment faire ressembler votre code à Java au lieu de C #:

public enum Difficulty { Easy, Normal, Hard }

public class Foo
{
    private Difficulty difficulty;

    public void SetDifficulty(Difficulty value)
    {
        difficulty = value;
    }

    public Difficulty GetDifficulty()
    {
        return difficulty;
    }
}
37
Jon Skeet

Votre code essaie d'affecter une valeur à Difficulty, alors qu'en fait Difficulty est le nom du type enum. J'encouragerais plutôt l'utilisation de getters et setters comme propriétés:

public enum Difficulty { Easy, Normal, Hard };

private Difficulty _difficulty;

public Difficulty CurrentDifficulty
{
    get { return _difficulty; }
    set { _difficulty = value; }
}

De cette façon, vous pouvez ajouter du code supplémentaire dans le setter pour des conditions spéciales. Pour l'utiliser, il vous suffit de procéder comme suit:

//set
CurrentDifficulty = Difficulty.Easy;

//get
Difficulty theDifficulty = CurrentDifficulty;
2
Vlad

L'énumération que vous souhaitez utiliser doit être publique. Vous avez également besoin d'une instance de cette énumération pour stocker la valeur que vous définissez, vous la définissez actuellement dans la déclaration de votre énumération. Ensuite, vous souhaitez utiliser le même type d'énumération pour ce que votre classe stocke et ce que vous transmettez.

public enum Difficulty { Easy, Normal, Hard };

public Difficulty { get; set; }
1
cost

Une fois que vous spécifiez une énumération à l'aide du mot clé enum, cette énumération agit comme un type, comme le feraient class ou struct.

Voici comment implémenter une propriété avec une énumération personnalisée:

public enum _Difficulty { Easy, Normal, Hard };
public _Difficulty Difficulty { get; set; }
1
DLeh

Il y a un certain nombre de problèmes ici:

  1. Votre enum est privé, donc rien ne pourra appeler SetDifficulty pour lui fournir une valeur à partir de ce enum. En effet, le compilateur ne le permettra pas.
  2. L'argument de SetDifficulty n'est qu'un type, il a également besoin d'un nom de variable. Également une erreur de compilation.
  3. Vous essayez d'obtenir/définir la valeur de l'énumération elle-même, plutôt qu'une variable de niveau classe du type de l'énumération. Cela ne se compilera pas non plus.

Il ressemble vous voulez faire ceci:

public enum Difficulty { Easy, Normal, Hard }

public Difficulty DifficultySetting { get; set; }

Notez que j'ai dû changer le nom de la propriété en DifficultySetting car cela entre en conflit avec le nom de l'énumération. Le vôtre a utilisé un trait de soulignement, qui résoudrait également ce problème. Cependant, j'ai toujours trouvé que les traits de soulignement sont pour les membres privés et si vous voulez que le code de consommation utilise ce enum alors il devrait être public. Décorer un membre public avec des choses comme des traits de soulignement distrait de la sémantique du nom lui-même. Dans tous les cas, la sémantique dépend de vos préférences personnelles, vous pouvez donc modifier ces noms comme bon vous semble.

0
David

Je ne suis pas sûr que vous les utilisiez correctement. Cela pourrait aider ...

private enum Difficulty { Easy, Normal, Hard };
private Diffuculty theDifficulty;

public void SetDifficulty(difficulty d)
{
    theDifficulty = difficulty;
}

public Difficulty GetDifficulty()
{
    return theDifficulty;
}
0
Liamdev631

Une énumération est un type pas un variable. Quelque chose comme ça fonctionnerait:

public enum Difficulty { Easy, Normal, Hard };

private Difficulty _Difficulty;

public void SetDifficulty(Difficulty difficulty )
{
    _Difficulty = Difficulty;
}

public Difficulty GetDifficulty()
{
    return _Difficulty;
}

ou plus succinctement en tant que propriété:

private Difficulty Difficulty {get; set;}

Notez que l'énumération doit être public si vous voulez qu'elle soit accessible à partir des méthodes publiques.

0
D Stanley