quelle est la différence entre cela et simplement créer une méthode qui reçoit une liste ou un tableau?
La différence entre
void M(params int[] x)
et
void N(int[] x)
est que M peut être appelé comme ceci:
M(1, 2, 3)
ou comme ça:
M(new int[] { 1, 2, 3 });
mais N ne peut être appelé que de la deuxième manière, pas de la première .
peut-être que cela a un impact sur les performances?
L'impact sur les performances est que, que vous appeliez M
de la première ou de la deuxième manière, de toute façon, vous créez un tableau. La création d'une baie a un impact sur les performances car elle prend du temps et de la mémoire. N'oubliez pas que les impacts sur les performances doivent être mesurés par rapport aux objectifs de performances; il est peu probable que le coût de la création d'une baie supplémentaire soit le facteur de déclenchement qui fait la différence entre le succès et l'échec sur le marché.
Je ne comprends pas complètement ou ne vois pas en quoi vous préféreriez celui avec des paramètres illimités.
C'est purement et entièrement une commodité pour l'auteur du code qui appelle la méthode; il est simplement plus court et plus facile à écrire
M(1, 2, 3);
au lieu d'écrire
M(new int[] { 1, 2, 3 });
Il enregistre simplement quelques touches du côté de l'appelant. C'est tout.
Quelques questions que vous n'avez pas posées mais que vous souhaiteriez peut-être connaître:
Comment s'appelle cette fonctionnalité?
Les méthodes qui permettent de passer un nombre variable d'arguments du côté de l'appelant sont appelées variadic . Les méthodes params sont la façon dont C # implémente les méthodes variadiques.
Comment fonctionne la résolution de surcharge avec une méthode variadique?
Lorsqu'il est confronté à un problème de résolution de surcharge, C # considérera les formulaires "normal" et "étendu", et le formulaire "normal" l'emportera toujours si les deux sont applicables. Par exemple, considérez ceci:
void P(params object[] x){}
et nous avons un appel
P(null);
Il y a deux possibilités applicables. Sous forme "normale", nous appelons P
et passons une référence nulle pour le tableau. Sous forme "élargie", nous appelons P(new object[] { null })
. Dans ce cas, la forme normale l'emporte. Si nous avons eu un appel, P(null, null)
le formulaire normal est inapplicable et le formulaire étendu gagne par défaut.
Défi : Supposons que nous ayons var s = new[] { "hello" };
un appel P(s);
. Décrivez ce qui se passe sur le site de l'appel et pourquoi. Vous pourriez être surpris!
Défi : Supposons que nous ayons les deux void P(object x){}
et void P(params object[] x){}
. Que fait P(null)
et pourquoi?
Défi : Supposons que nous ayons les deux void M(string x){}
et void M(params string[] x){}
. Que fait M(null)
et pourquoi? En quoi cela diffère-t-il du cas précédent?
params
également que le type de l'argument soit un tableau. Si vous devez consommer une collection autre qu'un tableau, il peut être plus judicieux de fournir un non-params
argument à la place.Console.Write
.