Bien que d'autres réponses travaillent sur le plan technique, à mon avis, on ne devrait jamais retourner un tableau interne directement, car il va à l'encontre des bonnes pratiques dans la programmation orientée objet. Donc j'implémenterais l'interface IEnumerable dans cette classe ou au moins retournerais IEnumerator ou IEnumerable ce qui rendrait la collection retournée en lecture seule.
Exemple:
class ClassB {
int[] array;
public IEnumerable<int> GetValues() { return array; }
}
class ClassA {
void DoTheJob(ClassB source) {
foreach(int item in source.GetValues()) {
combobox.Items.Add(item);
}
}
}
Une autre solution propre est d'utiliser la fonctionnalité « voir avec les valeurs » à la classe B. Ensuite, nous fournissons simplement délégué.Exemple:
class ClassB {
int[] array;
public void DoWithValues(Action<int> action) {
foreach(int item in array) action(item);
}
}
class ClassA {
ComboBox combobox;
void DoTheJob(ClassB source) {
source.DoWithValues(item => combobox.Items.Add(item));
}
}
La prochaine (troisième) exemple montre comment faire toute ClassB dénombrable avec foreach:
static void Main(string[] args) {
ClassB b = new ClassB();
foreach(int i in b) Console.Write(i + " ");
}
class ClassB : IEnumerable<int> {
int[] array;
public ClassB() {
array = new int[20];
}
public IEnumerator<int> GetEnumerator() {
return (array as IEnumerable<int>).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return array.GetEnumerator();
}
}
mise à jour: Comme ja72 montré, cette technique simple qui publie tout recenseur du tableau interne , ne masque pas physiquement le tableau, car IEnumerator résultant peut être renvoyé à int []. Mon frère utilise toujours Clone() pour renvoyer une copie du tableau
mise à jour # 2: C'est le plus lent, mais il a dit qu'il a sauvé sa carrière plusieurs fois (il travaille sur un projet plus important dans une équipe).
Quelques * terribles * réponses à cette question. – tomfanning