2010-01-30 25 views
5

Disons que je crée ces deux méthodes:C#: signatures de méthodes?

public void AddScriptToPage(params string[] scripts) { /*...*/ } 
public void AddScriptToPage(string href, string elementId) { /*...*/ } 

Laquelle de ces méthodes GARDERA par le code ci-dessous, et pourquoi?

AddScriptToPage("dork.js", "foobar.js"); 

Comment le compilateur détermine-t-il la méthode à appeler?

Répondre

8

Votre deuxième méthode est appelée, si une correspondance exacte est trouvée, elle est utilisée avant les paramètres.

From MSDN:

Lors de la résolution de surcharge, un procédé avec un tableau de paramètres est susceptible d'être soit sous sa forme normale ou sous sa forme expansée (section 7.4.2.1). La forme développée d'une méthode n'est disponible que si la forme normale de la méthode n'est pas applicable et seulement si une méthode ayant la même signature que le formulaire développé n'est pas déjà déclarée dans le même type.

Leur exemple:

using System; 
class Test 
{ 
    static void F(params object[] a) { 
     Console.WriteLine("F(object[])"); 
    } 
    static void F() { 
     Console.WriteLine("F()"); 
    } 
    static void F(object a0, object a1) { 
     Console.WriteLine("F(object,object)"); 
    } 
    static void Main() { 
     F(); 
     F(1); 
     F(1, 2); 
     F(1, 2, 3); 
     F(1, 2, 3, 4); 
    } 
} 

Sortie:

F(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]); 
+0

Ceci est particulièrement déroutant pour les gens quand ils appellent F (null). Avez-vous F ((object []) null) ou F (new object [] {null})? Beaucoup de gens s'attendent à ce dernier, mais puisque le premier est applicable dans la forme normale, c'est mieux. –

+0

@Eric - Vous ne cessez jamais de me surprendre avec une question cadre/fait à laquelle je ne penserais jamais ... mais que je finis par utiliser en pratique des mois plus tard. Certaines de vos réponses ici ont fait d'énormes différences de performance pour moi, continuez comme ça. –

+0

Dans la ligne de votre commentaire, si vous n'avez pas lu la spécification annotée publiée par Microsoft, vous devriez vraiment; c'est une mine d'or. – jason

5
public void AddScriptToPage(string href, string elementId) 

.. sera appelée. Le compilateur choisit la signature avec la correspondance la plus précise, les paramètres ayant la priorité la plus faible.