Wat is de { get; set; } syntaxis in C#?

Ik ben ASP.NET MVC aan het leren en ik kan Engelse documenten lezen, maar ik begrijp niet echt wat er in deze code gebeurt:

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

Wat betekent dit: { get; set; }?


Antwoord 1, autoriteit 100%

Het is een zogenaamde auto-eigenschap en is in wezen een afkorting voor het volgende (vergelijkbare code wordt gegenereerd door de compiler):

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

Antwoord 2, autoriteit 75%

Zoals ik het begrijp { get; set; }is een “auto-eigenschap” die, zoals @Klaus en @Brandon zeiden, een afkorting is voor het schrijven van een eigenschap met een “backing-veld”. Dus in dit geval:

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

Als je echter net als ik bent – ongeveer een uur geleden – begrijp je niet echt welke eigenschappenen accessorszijn, en je hebt ook niet het beste begrip van enkele basisterminologieën. MSDN is een geweldig hulpmiddel om dit soort dingen te leren, maar het is niet altijd gemakkelijk te begrijpen voor beginners. Dus ik ga proberen dit hier uitgebreider uit te leggen.

geten setzijn accessors, wat betekent dat ze toegang hebben tot gegevens en informatie in private-velden (meestal uit een backing-veld) en meestal uit publicproperties( zoals je kunt zien in het bovenstaande voorbeeld).

Het valt niet te ontkennen dat de bovenstaande verklaring behoorlijk verwarrend is, dus laten we naar enkele voorbeelden gaan. Laten we zeggen dat deze code verwijst naar muziekgenres. Dus binnen de klasse Genre willen we verschillende muziekgenres. Laten we zeggen dat we 3 genres willen hebben: hiphop, rock en country. Hiervoor gebruiken we de naam van de Klasseom nieuwe instantiesvan die klasse te maken.

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)

Nu we de instanties van de klasse Genre hebben gemaakt, kunnen we de genrenamen instellen met behulp van de ‘Naam’ eigenschapdie helemaal hierboven is ingesteld.

p>

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

We kunnen de naam van ‘g1’ instellen op Hip Hop door het volgende te schrijven

g1.Name = "Hip Hop";

Wat hier gebeurt, is nogal complex. Zoals ik al eerder zei, geten settoegang tot informatie uit privévelden waar je anders geen toegang toe zou hebben. getkan alleen informatie uit dat privéveld lezenen teruggeven. setkan alleen informatie schrijvenin dat privéveld. Maar door een eigenschap te hebben met zowel getals setkunnen we beide functies uitvoeren. En door g1.Name = "Hip Hop";te schrijven, gebruiken we specifiek de functie setvan onze eigenschap Name

setgebruikt een impliciete variabele genaamd value. Wat dit in feite betekent, is dat elke keer dat je “waarde” ziet in set, het verwijst naar een variabele; de variabele “waarde”. Wanneer we g1.Name =schrijven, gebruiken we de =om de variabele valuedoor te geven, in dit geval "Hip Hop". Je kunt het dus in wezen als volgt zien:

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"'
    }
}

Het is belangrijk op te merken dat het bovenstaande voorbeeld niet echt in de code is geschreven. Het is meer een hypothetische code die aangeeft wat er op de achtergrond gebeurt.

Dus nu we ingesteldde naam van de g1-instantie van Genre, denk ik dat we de naam krijgendoor te schrijven

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"

En als we dit liepen, zouden we "Hip Hop"in onze console krijgen.

Dus voor het doel van deze uitleg, zal ik ook het voorbeeld met uitgangen voltooien

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);
    }
}

output:

"Genres: Hip Hop, Rock, Country"

Antwoord 3, Autoriteit 17%

die zijn automatische eigenschappen

eigenlijk een andere manier om een ​​woning te schrijven met een backing-veld.

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

Antwoord 4, Autoriteit 6%

Dit is de korte manier om dit te doen:

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

Antwoord 5, autoriteit 6%

Het is een snelkoppeling om gegevensleden openbaar te maken, zodat u niet expliciet privégegevensleden hoeft te maken. C# maakt een lid met privégegevens voor u aan.

U kunt uw gegevensleden gewoon openbaar maken zonder deze snelkoppeling te gebruiken, maar als u dan besluit om de implementatie van het gegevenslid te wijzigen om enige logica te hebben, moet u de interface breken. Kortom, het is een snelkoppeling om flexibelere code te maken.


Antwoord 6, autoriteit 3%

Kortom, het is een snelkoppeling van:

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

Antwoord 7, autoriteit 2%

Het is een automatisch geïmplementeerde eigenschapvoor C#.


Antwoord 8

  • Het get/set-patroon biedt een structuur waarmee logica kan worden toegevoegd tijdens het instellen (‘set’) of ophalen (‘get’) van een eigenschapsinstantie van een geïnstantieerde klasse, wat handig kan zijn wanneer sommige instantiatielogica is vereist voor de eigenschap.

  • Een eigenschap kan alleen een ‘get’-accessor hebben, wat wordt gedaan om die eigenschap alleen-lezen te maken

  • Bij het implementeren van een get/set-patroon wordt een tussenliggende variabele gebruikt als een container waarin een waarde kan worden geplaatst en een waarde kan worden geëxtraheerd. De tussenliggende variabele wordt meestal voorafgegaan door een onderstrepingsteken.
    deze tussenvariabele is privé om ervoor te zorgen dat deze alleen toegankelijk is via de get/set-aanroepen. Zie het antwoord van Brandon, aangezien zijn antwoord de meest gebruikte syntaxisconventies voor het implementeren van get/set demonstreert.


Antwoord 9

Dit zijn de accessors voor de naam van het openbare eigendom.

U zou ze gebruiken om de waarde van die eigenschap op te halen/in te stellen in een instantie van Genre.


Antwoord 10

Dat is een automatisch geïmplementeerde eigenschap. Het is eigenlijk een verkorte manier om eigenschappen voor een klasse in C# te maken, zonder dat je daarvoor privévariabelen hoeft te definiëren. Ze worden normaal gesproken gebruikt wanneer er geen extra logica nodig is bij het ophalen of instellen van de waarde van een variabele.

U kunt meer lezen in MSDN’s Auto-geïmplementeerde eigenschappen Programming Guide.


Antwoord 11

Dit betekent dat als u een variabele van het type Genre maakt, u de variabele als een eigenschap kunt benaderen

Genre oG = new Genre();
oG.Name = "Test";

Antwoord 12

Als u in Visual Studio een eigenschap Xin een klasse definieert en u deze klasse alleen als een type wilt gebruiken, krijgt u na het bouwen van uw project een waarschuwing met de tekst “Veld X is nooit toegewezen aan en heeft altijd zijn standaardwaarde”.

Door een { get; set; }naar Xeigenschap, krijgt u deze waarschuwing niet.

Bovendien in Visual Studio 2013 en hogere versies, door { get; set; }je kunt alle verwijzingen naar die eigenschap zien.


Antwoord 13

Zo’n { get; set; }syntaxis wordt automatische eigenschappen genoemd, C# 3.0-syntaxis

Je moet Visual C# 2008 / csc v3.5 of hoger gebruiken om te compileren.
Maar u kunt uitvoer compileren die zo laag is als .NET Framework 2.0 (geen runtime of klassen vereist om deze functie te ondersteunen).


Antwoord 14

Het is eigenlijk een steno. U kunt public string Name { get; set; }zoals in veel voorbeelden, maar je kunt het ook schrijven:

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

Waarom wordt het gebruikt? Het kan worden gebruikt om de toegang tot een eigenschap te filteren, bijvoorbeeld als u niet wilt dat namen nummers bevatten.

Laat me je een voorbeeld geven:

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

Officieel heet het automatisch geïmplementeerde eigenschappen en het is een goede gewoonte om de (programmeergids).
Ik zou ook de instructievideo C#-eigenschappen aanbevelen: waarom “get” en “set”gebruiken .


Antwoord 15

Get set zijn toegangsmodifiers voor eigendom.
Get leest het eigenschapsveld.
Set stelt de eigenschapswaarde in.
Get is als alleen-lezen toegang.
Set is als alleen-schrijven toegang.
Om de eigenschap als lezen en schrijven te gebruiken, moeten zowel get als set worden gebruikt.


Antwoord 16

Get wordt aangeroepen wanneer de eigenschap aan de rechterkant verschijnt (RHS)
Set wordt aangeroepen wanneer de eigenschap aan de linkerkant wordt weergegeven (LHS)
van ‘=’ symbool

Voor een automatisch geïmplementeerde eigenschap werkt het achtergrondveld achter de schermen en is het niet zichtbaar.

Voorbeeld:

public string Log { get; set; }

Terwijl voor een niet automatisch geïmplementeerde eigenschap het achtergrondveld vooraf is, zichtbaar als een privébereikvariabele.

Voorbeeld:

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

Het is ook vermeldenswaard dat de ‘getter’ en ‘setter’ de verschillende ‘backing-velden’ kunnen gebruiken


Antwoord 17

Een eigenschap is een soort laag die de privévariabele scheidt van andere leden van een klasse. Van buitenaf voelt het alsof een eigendom slechts een veld is, een eigendom kan worden benaderd met .Property

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName => $"{FirstName} {LastName}";
}
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return $"{FirstName} {LastName}"; } }
}

Volledige naam is een eigenschap. Degene met pijl is een snelkoppeling. Van buitenaf hebben we als volgt toegang tot FullName:

var person = new Person();
Console.WriteLine(person.FullName);

bellers geven niet om hoe u de volledige naam hebt geïmplementeerd. Maar in de klas kunt u volledige naam wijzigen wat u maar wilt.

Bekijk Microsoft-documentatie voor meer gedetailleerde uitleg:

https://docs.microsoft.com/en-us/dotnet / csharp / eigenschappen


Antwoord 18

In principe helpt het om uw gegevens te beschermen. Overweeg dit voorbeeld zonder setters en getter en dezelfde met hen.

zonder setters en getsers

Klasse student

using System;
using System.Collections.Generic;
using System.Text;
namespace MyFirstProject
{
    class Student
    {
        public string name;
        public string gender;
        public Student(string cName, string cGender)
        {
            name = cName;
            gender= cGender;
        }
     }
}

in hoofd

Student s = new Student("Some name", "Superman"); //Gender is superman, It works but it is meaningless
 Console.WriteLine(s.Gender);

met setters en getters

using System;
using System.Collections.Generic;
using System.Text;
namespace MyFirstProject
{
    class Student
    {
        public string name;
        private string gender;
        public Student(string cName, string cGender)
        {
            name = cName;
            Gender = cGender;
        }
        public string Gender
        {
            get { return gender; }
            set
            {
                if (value == "Male" || value == "Female" || value == "Other")
                {
                    gender = value;
                }
                else
                {
                    throw new ArgumentException("Invalid value supplied");
                }
            }
        }
    }
}

Algemeen:

 Student s = new Student("somename", "Other"); // Here you can set only those three values otherwise it throws ArgumentException.
Console.WriteLine(s.Gender);

Antwoord 19

Definieer de privévariabelen

In de Constructor en laad de gegevens

Ik heb Constant gemaakt en de gegevens van de constante naar de klasse Selected List geladen.

public  class GridModel
{
    private IEnumerable<SelectList> selectList;
    private IEnumerable<SelectList> Roles;
    public GridModel()
    {
        selectList = from PageSizes e in Enum.GetValues(typeof(PageSizes))
                       select( new SelectList()
                       {
                           Id = (int)e,
                           Name = e.ToString()
                       });
        Roles= from Userroles e in Enum.GetValues(typeof(Userroles))
               select (new SelectList()
               {
                   Id = (int)e,
                   Name = e.ToString()
               });
    }
  public IEnumerable<SelectList> Pagesizelist { get { return this.selectList; } set { this.selectList = value; } } 
  public IEnumerable<SelectList> RoleList { get { return this.Roles; } set { this.Roles = value; } }
  public IEnumerable<SelectList> StatusList { get; set; }
}

Other episodes