web-dev-qa-db-fra.com

Utilisation de la syntaxe C # Get/Set

Ce sont des déclarations pour une classe Person. 

protected int ID { get; set; }
protected string Title { get; set; }
protected string Description { get; set; }
protected TimeSpan jobLength { get; set; }

Comment puis-je utiliser le get/set? En gros, j'instancie un 

Person Tom = new Person();

Comment Tom.set/get ??

Je suis habitué à faire du style C++ où vous écrivez simplement les fonctions int getAge () et void setAge (). Mais en C #, les raccourcis sont-ils gérés? 

32
RoR

En supposant que vous y ayez accès (les propriétés que vous avez déclarées sont protected), vous les utilisez comme ceci:

Person tom = new Person();
tom.Title = "A title";
string hisTitle = tom.Title;

Ce sont properties . Ce sont essentiellement des paires de méthodes getter/setter (bien que vous puissiez avoir juste un getter ou un setter) avec les métadonnées appropriées. L'exemple que vous avez donné concerne des propriétés implémentées automatiquement dans lesquelles le compilateur ajoute un champ de sauvegarde. Vous pouvez cependant écrire le code vous-même. Par exemple, la propriété Title que vous avez déclarée est la suivante:

private string title; // Backing field
protected string Title
{
    get { return title; }  // Getter
    set { title = value; } // Setter
}

... sauf que le champ de support se voit attribuer un "nom indéfinissable", auquel vous ne pouvez pas vous référer dans votre code C #. Vous êtes obligé de passer par la propriété elle-même.

Vous pouvez rendre une partie d'une propriété plus restreinte qu'une autre. Par exemple, cela est assez courant:

private string foo;
public string Foo
{
    get { return foo; }
    private set { foo = value; }
}

ou en tant que propriété implémentée automatiquement:

public string Foo { get; private set; }

Ici, le "getter" est public mais le "passeur" est privé.

71
Jon Skeet

En supposant que vous ayez une classe de chanson (vous pouvez vous reporter ci-dessous), la mise en œuvre traditionnelle serait la suivante:

 class Song
  {
       private String author_name;
       public String setauthorname(String X) {}; //implementation goes here
       public String getauthorname() {}; //implementation goes here
  }

Maintenant, considérons cette implémentation de classe.

      class Song 
      {
            private String author_name;
            public String Author_Name
            { 
                 get { return author_name; }
                set { author_name= value; }
             }
      }

Dans votre classe principale, vous écrivez votre code comme

    class TestSong
    { 
      public static void Main(String[] Args)
      {
          Song _song = new Song(); //create an object for class 'Song'    
          _song.Author_Name = 'John Biley';
          String author = _song.Author_Name;           
          Console.WriteLine("Authorname = {0}"+author);
      }
    }

Point à noter;

La méthode que vous définissez/obtenez devrait être publique ou protégée (prenez garde) mais ne devrait pas être strictement privée.

Ce sont propriétés . Vous les utiliseriez comme ceci:

Tom.Title = "Accountant";
string desc = Tom.Description;

Mais étant donné qu'ils sont déclarés protected, leur visibilité peut poser problème. 

2
Gavin H

À propos, en C # 3.5, vous pouvez instancier les propriétés de votre objet de la manière suivante:

Person TOM=new Person 
{ 
   title = "My title", ID = 1 
};

Mais encore une fois, les propriétés doivent être publiques.

1
Nickolodeon

Je ne comprends pas ce que cela n'est pas clair

Les propriétés sont des membres qui fournissent un mécanisme flexible pour lire, écrire ou calculer les valeurs des champs privés. Les propriétés peuvent être utilisées comme s'il s'agissait de données membres, mais il s'agit en réalité de méthodes spéciales appelées accesseurs. Cela permet d'accéder facilement aux données tout en assurant la sécurité et la flexibilité des méthodes.

Dans cet exemple, la classe TimePeriod stocke une période. En interne, la classe stocke l'heure en secondes, mais une propriété appelée Heures permet à un client de spécifier une heure en heures. Les accesseurs de la propriété Heures effectuent la conversion entre heures et secondes.

Exemple

class TimePeriod
{
    private double seconds;

    public double Hours
    {
        get { return seconds / 3600; }
        set { seconds = value * 3600; }
    }
}

class Program
{
    static void Main()
    {
        TimePeriod t = new TimePeriod();

        // Assigning the Hours property causes the 'set' accessor to be called.
        t.Hours = 24;

        // Evaluating the Hours property causes the 'get' accessor to be called.
        System.Console.WriteLine("Time in hours: " + t.Hours);
    }
}

Vue d'ensemble des propriétés

Les propriétés permettent à une classe d'exposer un moyen public d'obtenir et de définir des valeurs, tout en masquant le code d'implémentation ou de vérification.

Un accesseur de propriété get est utilisé pour renvoyer la valeur de la propriété, et un accesseur set est utilisé pour affecter une nouvelle valeur. Ces accesseurs peuvent avoir différents niveaux d'accès.

Le mot-clé value sert à définir la valeur attribuée par l'indexeur de l'ensemble.

Les propriétés qui n'implémentent pas une méthode set sont en lecture seule.

http://msdn.Microsoft.com/en-US/library/x9fsa0sw%28v=vs.80%29.aspx

0
Ivan

Réglez-les au public. Autrement dit, partout où vous avez le mot "protégé", changez-le pour le mot "public". Si vous avez besoin d'un contrôle d'accès, mettez-le à l'intérieur, devant le mot "get" ou le mot "set".

0
GWLlosa

Vous ne pouvez pas accéder à ces propriétés car elles sont marquées comme protected signifie:

Le type ou le membre n'est accessible que par le code de la même classe ou structure, ou d'une classe dérivée de cette classe.

0
Anders Arpi