J'ai une classe dotée d'une propriété de tableau entier et j'essaie de comprendre la bonne syntaxe. Le tableau entier est instancié dans le constructeur de classe.
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. } }
6 Réponses :
recherchez-vous: comme pour les propriétés normales qui ne font que de publier un champ privé (comme vous semblez vouloir): p> private int[] myNumbers;
public int[] MyNumbers
{
get { return myNumbers; }
set { myNumbers = value; }
}
J'aimerais savoir comment cela fonctionne lorsque je n'utilise pas les propriétés automatiques et j'ai un champ pour stocker le tableau.
Les matrices sont juste un type de référence en C #, vous pouvez lancer int [] code> au système.array` par exemple. Sans propriétés automatiques, vous venez de faire
int [] nums; Public int [] Nums {Obtenir {Nums de retour;} Set {Nums = Valeur}} Code>. Mind You Si vous voulez obtenir / définir des éléments individuels de la matrice, vous devez créer un Propriété indexer .
Je suggérerais également d'utiliser un setter privé.
Merci, ça marche! Je pense que je l'ai surprise en pensant comment le bon indice est transmis à la propriété mynumbers, mais cela a été fait automatiquement. Encore beaucoup à apprendre. Merci également à Serguei. Je vais examiner les propriétés de l'index et voir ce qu'ils peuvent faire.
Il convient de noter que Microsoft ne recommande pas d'utiliser des tableaux dans des propriétés: msdn.microsoft.com/en-us/library/0fsss9skc%28v=vs.120%29.aspx
@Metalphoenix et pour une bonne raison. Il expose privé pouvant être modifié sans respecter vos règles d'entreprise. Utilisez des propriétés indexées à la place.
Si le nombre d'éléments dans la matrice est fixé, je ne fournirais qu'un getter pour le tableau et laisserais hors du réglage. Vous serez toujours en mesure d'affecter des valeurs à des éléments individuels dans la matrice, mais cela empêchera une personne d'échanger l'ensemble de la matrice entière de vous (ou de la définir à null code>. Le code ressemblerait à ceci:
class DemoClass
{
public int[] MyNumbers
{ get; private set; }
public DemoClass(int elements)
{
MyNumbers = new int[elements];
}
}
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. } }
class DemoClass { private int[] myNumbers; public int[] MyNumbers { get { return myNumbers; } set { myNumbers = value;} } public DemoClass(int elements) { // Here, the array should get instantiated using the elements. MyNumbers = new int[5] { 1, 2, 3, 4, 5}; } }
Il s'appelle propriétés appliquées automatiquement . Donc, si vous avez la syntaxe comme
public int[] MyNumbers { get; set; }
CA1819: Les propriétés ne doivent pas renvoyer des tableaux p>
http://msdn.microsoft.com/en-us/library/ 0FSS9SKC.ASPX P>
Les tableaux retourné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 conserver la grave alternance, la propriété doit renvoyer une copie de la matrice. En règle générale, les utilisateurs ne comprendront pas les conséquences néfastes sur les performances d'appeler une telle propriété. Plus précisément, ils pourraient utiliser la propriété comme une propriété indexée. P>
Pour résoudre une violation de cette règle, faites une méthode de la propriété ou modifier la propriété pour renvoyer une collection au lieu d'un tableau P>
Essayez-vous de créer un indexer propriété par une autre chance?