Le modificateur de paramètre params
donne aux appelants une syntaxe de raccourci pour transmettre plusieurs arguments à une méthode.Il y a deux façons d'appeler une méthode avec un paramètre params
:
1) Appel avec un tableau du type de paramètre, auquel cas le mot-clé params
n'a aucun effet et le tableau est transmis directement à la méthode:
object[] array = new[] { "1", "2" };
// Foo receives the 'array' argument directly.
Foo(array);
2) Ou, appelant une liste étendue d'arguments, dans ce cas, le compilateur se terminera automatiquement la liste des arguments dans un tableau temporaire et que passer à la méthode:
// Foo receives a temporary array containing the list of arguments.
Foo("1", "2");
// This is equivalent to:
object[] temp = new[] { "1", "2");
Foo(temp);
Afin de passer dans un tableau d'objet à une méthode avec un paramètre « params object[]
», vous pouvez:
1) créer une matrice d'enveloppe manuellement et passe que directement à la procédé, tel que mentionné par lassevk:
Foo(new object[] { array }); // Equivalent to calling convention 1.
2) Or, l'argument de coulée object
, comme mentionné par Adam, auquel cas le compilateur crée le tableau d'emballage pour vous:
Foo((object)array); // Equivalent to calling convention 2.
Cependant, si l'objectif de la méthode consiste à traiter plusieurs tableaux d'objets, il peut être plus facile de déclarer avec un paramètre explicite "params object[][]
". Cela vous permettra de passer plusieurs tableaux comme arguments:
void Foo(params object[][] arrays) {
foreach(object[] array in arrays) {
// process array
}
}
...
Foo(new[] { "1", "2" }, new[] { "3", "4" });
// Equivalent to:
object[][] arrays = new[] {
new[] { "1", "2" },
new[] { "3", "4" }
};
Foo(arrays);
Edit: Raymond Chen décrit ce comportement et la façon dont elle se rapporte à la spécification C# dans a new post.
la façon dont params œuvres semble inutile, et la conception suboptimale C#, étant donné ce que nous sommes habitués dans d'autres langues. params aurait pu être fait pour n'accepter qu'un seul formulaire, et une fonctionnalité similaire à la propagation pourrait être ajoutée, ce qui serait bénéfique pour l'ensemble de la langue, pas seulement pour ce cas. Par exemple, nous pourrions forcer tous les appels de paramètres à être Foo (obj [0], obj [1]), et avoir un opérateur de propagation séparé permettant Foo (... obj). – Lee
réalisé je n'avais pas précisé que j'ai un grand respect pour anders hejlsberg, il est l'un des meilleurs concepteurs de la langue dans le monde. mais nous pouvons penser à des améliorations au travail de n'importe qui avec assez de recul, d'où la technologie. – Lee