web-dev-qa-db-fra.com

Syntaxe de la propriété Array en C #

J'ai une classe qui a une propriété de tableau entier et j'essaie de trouver la bonne syntaxe pour cela. Le tableau int est instancié dans le constructeur de classes.

class DemoClass
{
    private int[] myNumbers;
    public int[] MyNumbers
    {
        get { /* Some logic */ }
        set { /* Some logic */ }
    }

    public DemoClass(int elements)
    {
        // Here, the array should get instantiated using the elements.
    }
}

Comment la syntaxe de bloc get/set fonctionne-t-elle si je veux que mon code client récupère un numéro du tableau via la propriété MyNumbers? Comment puis-je lui envoyer le bon index? Que dois-je initialiser?

9
Gasoline

Cherchez-vous:

class DemoClass
{
    public int[] MyNumbers { get; private set; }

    public DemoClass(int elements)
    {
        MyNumbers = new int[elements];
    }
}

En ce qui concerne les propriétés normales qui ne font rien sauf publier un champ privé (comme vous semblez vouloir):

private int[] myNumbers;
public int[] MyNumbers
{
    get { return myNumbers; }
    set { myNumbers = value; }
}
21
Blindy

CA1819: les propriétés ne doivent pas renvoyer de tableaux

http://msdn.Microsoft.com/en-us/library/0fss9skc.aspx

Les tableaux renvoyés par les propriétés ne sont pas protégés en écriture, même si la propriété est en lecture seule. Pour que le tableau reste inviolable, la propriété doit renvoyer une copie du tableau. En règle générale, les utilisateurs ne comprendront pas les conséquences néfastes de l'appel d'une telle propriété sur les performances. Plus précisément, ils pourraient utiliser la propriété en tant que propriété indexée.

Pour corriger une violation de cette règle, faites de la propriété une méthode ou modifiez-la pour renvoyer une collection au lieu d'un tableau.

11
Derek Johnson

Si le nombre d'éléments dans le tableau est fixe, je ne fournirais qu'un getter pour le tableau et laisserais le setter. Vous pourrez toujours attribuer des valeurs à des éléments individuels du tableau, mais cela empêchera quelqu'un d'extraire le tableau entier de dessous (ou de le définir sur null. Le code ressemblerait à ceci:

class DemoClass
{
    public int[] MyNumbers
    { get; private set; }

    public DemoClass(int elements)
    {
        MyNumbers = new int[elements];
    }
}

Si le nombre d'éléments n'est pas fixe, vous devriez alors utiliser un List<int> plutôt qu'un tableau, puis vous décidément voudriez une propriété sans passeur.

0
Joel Coehoorn
 class DemoClass
    {
        private int[] myNumbers;
        public int[] MyNumbers
        {
            get { return myNumbers; }
            set { myNumbers = value; }
        }

        public DemoClass(int[] elements)
        {
            myNumbers = elements;
            // Here, the array should get instantiated using the elements.
        }
    }
0
Haris Hasan

Il s'appelle Propriétés implémentées automatiquement . Donc, si vous avez la syntaxe comme

public int[] MyNumbers { get; set; }

Le compilateur C # créera automatiquement pour vous un champ de sauvegarde. Cette fonctionnalité a été introduite dans C # 3.0 et auparavant, vous deviez toujours implémenter une propriété avec un champ de sauvegarde.

Vous pouvez en savoir plus sur: Nouvelles fonctionnalités du langage "Orques" en C #: propriétés automatiques, initialiseurs d'objet et initialiseurs de collection

0
Vlad Bezden