web-dev-qa-db-fra.com

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 dans ce code:

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

Qu'est-ce que cela signifie: { get; set; }?

530
kn3l

C'est une propriété dite 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;
    }
}
528
Klaus Byskov Pedersen

Donc, si je comprends bien, { get; set; } est une "propriété auto" qui, tout comme @Klaus et @Brandon, est un raccourci pour l'écriture d'une propriété avec un "champ de support". 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 - ( les accesseurs le sont, et vous n’avez pas la meilleure compréhension de certaines terminologies de base. MSDN est un excellent outil pour apprendre de telles choses, mais il n’est pas toujours facile à comprendre pour les débutants. Je vais donc essayer d'expliquer cela plus en profondeur ici.

get et set sont des accesseurs , ce qui signifie qu'ils peuvent accéder aux données et aux informations dans privé champs (généralement à partir d'un champ de sauvegarde ) et généralement à partir de public 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 déroutante, alors allons-en quelques exemples. Disons que ce code fait référence à des genres de musique. 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 utiliserions le nom de Classe pour créer un nouveau 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 à l'aide de la propriété 'Name' a été placé bien en haut.

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' sur Hip Hop en écrivant ce qui suit

g1.Name = "Hip Hop";

Ce qui se passe ici est en quelque sorte complexe. Comme je l'ai déjà dit, get et set accèdent à des informations à partir de champs privés auxquels vous n'auriez autrement pas accès. get ne peut que lire informations de ce champ privé et les renvoyer. set ne peut que écrire des informations dans ce champ privé. Mais en ayant une propriété avec à la fois get et set, nous pouvons exécuter ces deux fonctions. Et en écrivant g1.Name = "Hip Hop";, nous utilisons spécifiquement la fonction set 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, cela fait référence à une variable; la variable "valeur". Lorsque nous écrivons g1.Name =, nous utilisons le = pour transmettre la variable value qui, dans ce cas, est "Hip Hop". Donc, vous pouvez essentiellement penser comme ça:

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 écrit dans le code. C'est plutôt un code hypothétique qui représente ce qui se passe à l'arrière-plan.

Alors maintenant que nous avons défini 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 but de cette explication, je vais compléter l'exemple avec des sorties aussi

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"
410
Josie Thompson

Ce sont propriétés automatiques

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

public class Genre
{
    private string _name;

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

Voici le moyen court de faire ceci:

public class Genre
{
    private string _name;

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

Il s'agit d'un raccourci pour exposer les membres de données comme public, de sorte que vous n'ayez pas besoin de créer explicitement un membre de données privé. C # créera 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écidiez de modifier l'implémentation du membre de données pour qu'il y ait une certaine logique, il vous faudrait alors casser l'interface. En bref, c’est un raccourci pour créer un code plus flexible.

29
Kelsey

En gros, c'est un raccourci de:

class Genre{
    private string genre;
    public string 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
15
Jirson Tavera
10
Daniel A. White

C'est une propriété implémentée automatiquement. C'est en gros un moyen de créer des propriétés pour une classe en C #, sans avoir à définir de variables privées pour elles. Ils sont normalement utilisés lorsqu'aucune logique supplémentaire n'est requise pour obtenir ou définir la valeur d'une variable.

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

6
Dusda

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 instance de Genre.

6
TimCodes.NET
  • Le modèle get/set fournit une structure qui permet d’ajouter de la logique lors du paramétrage ("set") ou de la récupération ("get") d’une instance de propriété d’une classe instanciée, ce qui peut être utile lorsque la logique d’instanciation est requise. propriété.

  • Une propriété ne peut avoir qu'un accesseur 'get', ce qui est fait afin de rendre cette propriété en lecture seule.

  • Lors de l'implémentation d'un modèle get/set, une variable intermédiaire est utilisée en tant que conteneur dans lequel une valeur peut être placée et une valeur extraite. La variable intermédiaire est généralement précédée d'un trait de soulignement. cette variable intermédiaire est privée afin de s'assurer qu'elle ne peut être accédée que via ses appels get/set. Voir la réponse de Brandon, car sa réponse illustre les conventions de syntaxe les plus couramment utilisées pour implémenter get/set.

5
Chris Halcrow

Cela signifie que si vous créez une variable de type Genre, vous pourrez accéder à la variable en tant que propriété.

Genre oG = new Genre();
oG.Name = "Test";
5
David Brunelle

Dans Visual Studio, si vous définissez une propriété X dans une classe et que vous souhaitez utiliser cette classe uniquement en tant que type, vous obtenez un avertissement après la construction de votre projet . "Le champ X n'est jamais assigné à, et aura toujours sa valeur par défaut" .

En ajoutant une propriété { get; set; } à X, vous n'obtiendrez pas cet avertissement.

De plus, dans Visual Studio 2013 et versions supérieures, en ajoutant { get; set; }, vous pourrez voir toutes les références à cette propriété.

enter image description here

4
Omid Ebrahimi

Cette syntaxe { get; set; } est appelée propriétés automatiques, syntaxe C # 3.0

Vous devez utiliser Visual C # 2008/csc v3.5 ou supérieur pour compiler. Mais vous pouvez compiler une sortie dont les cibles sont aussi basses que .NET Framework 2.0 (aucune exécution ni classe ne sont requises pour prendre en charge cette fonctionnalité).

4
linquize

Get set sont des modificateurs d'accès à la propriété. Get lit le champ de propriété. Set définit la valeur de la propriété. Get est comme un accès en lecture seule. L'ensemble est comme un accès en écriture seule. Pour utiliser la propriété en lecture/écriture, get et set doivent être utilisés.

2
Ashraf Abusada

C'est fondamentalement un raccourci. Vous pouvez écrire public string Name { get; set; } comme dans de nombreux exemples, mais vous pouvez aussi l'écrire:

private string _name;

public string Name
{
    get { return _name; }
    set { _name = value ; } // value is a special keyword here
}

Pourquoi est-il utilisé? Il peut être utilisé pour filtrer l'accès à une propriété, par exemple, vous ne voulez pas que les noms incluent des nombres.

Laisse moi te donner un exemple:

private class Person {
    private int _age;  // Person._age = 25; will throw an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

Officiellement, il s’appelle Propriétés auto-implémentées et sa bonne habitude de lire le ( guide de programmation ). Je recommanderais aussi la vidéo de tutoriel Propriétés C #: Pourquoi utiliser "get" et "set" .

2
Randel

Get est invoqué lorsque la propriété apparaît à droite (RHS). Le jeu est invoqué lorsque la propriété apparaît à gauche (LHS) du symbole '='.

Pour une propriété implémentée automatiquement, le champ de sauvegarde fonctionne derrière la scène et n'est pas visible.

Exemple:

public string Log { get; set; }

Tandis que pour une propriété non implémentée automatiquement, le champ de sauvegarde est initial, visible en tant que variable étendue privée.

Exemple:

private string log;

public string Log
{
    get => log;
    set => log = value;
}

En outre, il est à noter ici est le "getter" et "setter" peut utiliser les différents "champ de sauvegarde"

1
Bala