Question Quel est le {get; ensemble; } syntaxe en C #?


J'apprends ASP.NET MVC, et je peux lire des documents en anglais, mais je ne comprends pas vraiment ce qui se passe avec ce code:

public class Genre
{
    public string Name { get; set; }
}

Qu'est-ce que ça veut dire: { get; set; }?


418
2018-02-23 20:49


origine


Réponses:


C'est une soi-disant propriété auto, et est essentiellement un raccourci pour ce qui suit (un code similaire sera généré par le compilateur):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}

426
2018-02-23 20:53



Donc, si je comprends bien { get; set; } est une "propriété automobile" qui, comme @Klaus et @Brandon, est un raccourci pour écrire une propriété avec un "backing field". Donc dans ce cas:

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

Cependant si vous êtes comme moi - il y a environ une heure - vous ne comprenez pas vraiment ce que Propriétés et accesseurs sont, et vous n'avez pas la meilleure compréhension de certaines terminologies de base non plus. MSDN est un excellent outil pour apprendre des choses comme ça, mais ce n'est pas toujours facile à comprendre pour les débutants. Donc, je vais essayer d'expliquer cela plus en détail ici.

get et set sont accesseurs, ce qui signifie qu'ils sont en mesure d'accéder aux données et informations dans privé champs (généralement d'un champ de support) et le font habituellement Publique  Propriétés (comme vous pouvez le voir dans l'exemple ci-dessus).

On ne peut nier que la déclaration ci-dessus est assez confuse, alors allons dans quelques exemples. Disons que ce code fait référence aux genres musicaux. Donc, dans la classe Genre, nous allons vouloir différents genres de musique. Disons que nous voulons avoir 3 genres: Hip Hop, Rock et Country. Pour ce faire, nous utilisons le nom de la Classe créer de nouvelles instances de cette classe.

Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
                        //called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();

//Note the () following new Genre. I believe that's essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it's there but I do know it's essential)

Maintenant que nous avons créé les instances de la classe Genre, nous pouvons définir les noms de genre en utilisant le «Nom» propriété cela a été mis en place au-dessus.

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

Nous pouvons définir le nom de 'g1' en Hip Hop en écrivant ce qui suit

g1.Name = "Hip Hop";

Ce qui se passe ici est un peu complexe. Comme je l'ai dit avant, get et set accéder à des informations provenant de champs privés auxquels vous ne pourriez pas accéder autrement. get peut seulement lis informations provenant de ce champ privé et le renvoyer. set peut seulement écrire informations dans ce domaine privé. Mais en ayant une propriété à la fois get et set nous sommes capables de faire ces deux fonctions. Et en écrivant g1.Name = "Hip Hop"; nous utilisons spécifiquement le set fonction de notre propriété Name

set utilise une variable implicite appelée value. Fondamentalement, cela signifie que chaque fois que vous voyez "valeur" dans set, il se réfère à une variable; la variable "value". Quand nous écrivons g1.Name = nous utilisons le = passer dans le value variable qui, dans ce cas est "Hip Hop". Donc vous pouvez essentiellement y penser comme ceci:

public class g1 //We've created an instance of the Genre Class called "g1"
{
    private string name;
    public string Name
    {
        get => name;
        set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because 
                              //'value' in 'g1' was set to "Hip Hop" by previously
                              //writing 'g1.Name = "Hip Hop"'
    }
}

Il est important de noter que l'exemple ci-dessus n'est pas réellement écrit dans le code. C'est plutôt un code hypothétique qui représente ce qui se passe en arrière-plan.

Alors maintenant que nous avons ensemble le nom de l'instance g1 de Genre, Je crois que nous pouvons obtenir le nom en écrivant

console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property 
                             //and returns the field 'name' which we just set to
                             //"Hip Hop"

et si nous courions cela, nous aurions "Hip Hop" dans notre console.

Donc, dans le cadre de cette explication, je vais compléter l'exemple avec des sorties ainsi

using System;
public class Genre
{
    public string Name { get; set; }
}

public class MainClass
{
    public static void Main()
    {
        Genre g1 = new Genre();
        Genre g2 = new Genre();
        Genre g3 = new Genre();

        g1.Name = "Hip Hop";
        g2.Name = "Rock";
        g3.Name = "Country";

        Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
    }
}

Sortie:

"Genres: Hip Hop, Rock, Country"

332
2018-04-02 21:42



Ce sont propriétés automatiques

Fondamentalement, une autre façon d'écrire une propriété avec un champ de support.

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}

90
2018-02-23 20:51



C'est la façon la plus rapide de le faire:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}

32
2018-02-23 20:54



C'est un raccourci pour exposer les membres de données en tant que public, de sorte que vous n'avez pas besoin de créer explicitement des membres de données privés. C # va créer un membre de données privé pour vous.

Vous pouvez simplement rendre vos membres de données publics sans utiliser ce raccourci, mais si vous décidez de modifier l'implémentation du membre de données pour avoir une certaine logique, vous devrez rompre l'interface. Bref, c'est un raccourci pour créer du code plus flexible.


21
2018-02-23 20:55



Fondamentalement c'est un raccourci de:

class Genre{
    private string genre;
    public void getGenre() {
        return this.genre;
    }
    public void setGenre(string theGenre) {
        this.genre = theGenre;
    }
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female

11
2017-09-12 01:07



C'est un propriété auto-implémentée pour C #.


7
2018-02-23 20:50



Ils sont les accesseurs de la propriété publique Name.

Vous les utiliseriez pour obtenir / définir la valeur de cette propriété dans une occurrence de Genre.


4
2018-02-23 20:51



C'est une propriété implémentée automatiquement. Il s’agit d’une manière simplifiée de créer des propriétés pour une classe en C #, sans avoir à définir de variables privées pour celles-ci. Ils sont normalement utilisés lorsqu'aucune logique supplémentaire n'est requise lors de l'obtention ou de la définition de la valeur d'une variable.

Vous pouvez en savoir plus sur MSDN Guide de programmation des propriétés implémentées automatiquement.


4
2018-02-23 20:52