Qu’est ce que 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 ssortingng Name { get; set; } } 

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

C’est une soi-disant propriété auto, et est essentiellement un raccourci pour les éléments suivants (un code similaire sera généré par le compilateur):

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

Donc, si je comprends bien { get; set; } { get; set; } { get; set; } est une “propriété auto” qui, tout comme @Klaus et @Brandon, est un raccourci pour écrire une propriété avec un “champ de sauvegarde”. Donc dans ce cas:

 public class Genre { private ssortingng name; // This is the backing field public ssortingng 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 sont les propriétés et les accessoires , et vous ne comprenez pas non plus certaines terminologies de base. 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 des accesseurs , ce qui signifie qu’ils peuvent accéder aux données et aux informations dans des champs privés (généralement à partir d’un champ de sauvegarde ) et le font généralement à partir de propriétés publiques (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 à 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 utiliserons le nom de la classe pour 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 à l’aide de la propriété ‘Name’ qui a été définie de la manière ci-dessus.

 public ssortingng 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 en quelque sorte complexe. Comme je l’ai déjà dit, get et set des informations d’access à partir de champs privés auxquels vous n’auriez pas pu accéder autrement. get ne peut que lire les informations de ce champ privé et les retourner. set ne peut écrire que des informations dans ce champ privé. Mais en ayant une propriété à la fois get et set nous pouvons faire 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 . En gros, cela signifie que chaque fois que vous voyez “value” dans set , cela fait référence à une variable; la variable “value”. Quand on écrit g1.Name = on utilise le = pour passer la variable value qui dans ce cas est "Hip Hop" . Vous pouvez donc essentiellement y penser comme ceci:

 public class g1 //We've created an instance of the Genre Class called "g1" { private ssortingng name; public ssortingng 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 en arrière-plan.

Donc, maintenant que nous avons défini le nom de l’instance g1 de Genre , je pense 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 compléterai l’exemple avec des sorties aussi

 using System; public class Genre { public ssortingng 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" 

Ce sont des propriétés automatiques

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

 public class Genre { private ssortingng _name; public ssortingng Name { get => _name; set => _name = value; } } 

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

 public class Genre { private ssortingng _name; public ssortingng Name { get => _name; set => _name = value; } } 

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 # créera un membre de données privé pour vous.

Vous pourriez 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 avoir une certaine logique, vous devez alors casser l’interface. Donc, en bref, c’est un raccourci pour créer un code plus flexible.

Fondamentalement c’est un raccourci de:

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

C’est une propriété implémentée automatiquement pour C #.

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.

C’est une propriété implémentée automatiquement. Il s’agit d’une manière simple 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 requirejse pour obtenir ou définir la valeur d’une variable.

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

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"; 

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

Vous devez utiliser Visual C # 2008 / csc v3.5 ou supérieur pour comstackr. Mais vous pouvez comstackr des résultats ciblés aussi bas que .NET Framework 2.0 (aucun runtime ou classes requirejs pour prendre en charge cette fonctionnalité).

  • Le modèle get / set fournit une structure qui permet d’append de la logique lors de la définition («set») ou de la récupération («get») d’une instance de propriété d’une classe instanciée, ce qui peut être utile lorsqu’une logique d’instanciation est requirejse. propriété.

  • Une propriété peut avoir un accesseur ‘get’ uniquement, ce qui est fait pour que cette propriété soit en lecture seule

  • Lors de l’implémentation d’un modèle get / set, une variable intermédiaire est utilisée comme conteneur dans lequel une valeur peut être placée et une valeur extraite. La variable intermédiaire est généralement préfixée par un trait de soulignement. cette variable intermédiaire est privée afin de garantir qu’elle est accessible uniquement 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.

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, après avoir créé votre projet, vous obtenez un avertissement indiquant que “le champ X n’est jamais affecté et aura toujours son valeur par défaut “ .

En ajoutant un { get; set; } { get; set; } { get; set; } à la propriété X , vous ne recevrez pas cet avertissement.

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

entrer la description de l'image ici

Get set sont des modificateurs d’access à la propriété. Get lit le champ de propriété. Set définit la valeur de la propriété. Get est comme l’access en lecture seule. Set est comme l’access en écriture seule. Pour utiliser la propriété en lecture-écriture, get et set doivent être utilisés.

Get est appelé lorsque la propriété apparaît sur le côté droit (RHS) Set est appelée lorsque la propriété apparaît sur le cô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 ssortingng Log { get; set; } 

Alors que pour une propriété non auto-implémentée, le champ de sauvegarde est initial, visible comme une variable de scope privée.

Exemple:

 private ssortingng log; public ssortingng Log { get => log; set => log = value; } 

En outre, il convient de noter que le «getter» et le «setter» peuvent utiliser le «backing field» différent.