2010-01-30 16 views
5

Lassen Sie uns sagen, dass ich diese beiden Methoden zu erstellen:C#: Methodensignaturen?

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

Welche dieser Methoden unter Aufruf durch den Code bekommt, und warum?

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

Wie bestimmt der Compiler, welche Methode aufgerufen werden soll?

Antwort

8

Ihre zweite Methode wird aufgerufen, wenn eine exakte Übereinstimmung gefunden wird, wird sie vor den Parametern verwendet.

From MSDN:

Bei Überlastung Auflösung durchgeführt wird, ein Verfahren, mit einem Parameterfeld kann entweder in seiner normalen Form oder in seiner erweiterten Form (Abschnitt 7.4.2.1) anwendbar sein. Die erweiterte Form einer Methode ist nur verfügbar, wenn die normale Form der Methode nicht anwendbar ist und nur dann, wenn eine Methode mit derselben Signatur wie die erweiterte Form nicht bereits im selben Typ deklariert ist.

Ihr Beispiel:

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); 
    } 
} 

Ausgang:

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

Dies ist besonders verwirrend für die Menschen, wenn sie F nennen (null). Erhalten Sie F ((object []) null) oder F (neues Objekt [] {null})? Viele Menschen erwarten das letztere, aber da das erstere in der normalen Form anwendbar ist, ist es besser. –

+0

@Eric - Sie hören nie auf, mich mit einer tiefen Rahmenfrage zu überraschen, an die ich nie denken würde ... aber am Ende benutze ich sie in der Praxis Monate später. Einige deiner Antworten hier haben enorme Leistungsunterschiede für mich gemacht, mach weiter so. –

+0

Wenn Sie die von Microsoft veröffentlichte annotierte Spezifikation nicht gelesen haben, sollten Sie, wie Sie meinen, bemerken: Es ist eine Goldmine. – jason

5
public void AddScriptToPage(string href, string elementId) 

.. wird aufgerufen. Der Compiler wählt die Signatur mit der genauesten Übereinstimmung aus, wobei Parameter die geringste Priorität haben.

Verwandte Themen