2013-07-29 4 views
6

Warum funktioniert "my,string".Split(',') in .NET C#?Warum "mein String" .Split (',') in .NET funktioniert C#

Die Deklaration von Split nach MSDN ist Split(Char[]). MSDN String.Split Method

angenommen, dass I C# 5, um die einzelnen char ',' zu char[] {','} umwandelt; Aber ich muss falsch sein, da der folgende Code nicht funktioniert:

static void Main() 
{ 
    GetChar(','); 
} 

static char GetChar(char[] input) 
{ 
    return input[0]; 
} 

EDIT: Dank der Jon Skeet Antwort änderte ich das Argument params char[] und es funktioniert das Konzept zu beweisen.

static char GetChar(params char[] input) 
{ 
    return input[0]; 
} 
+6

Beachten Sie das Schlüsselwort 'params' im Prototyp der' Split'-Methode, das angibt, dass die Methode eine variable Anzahl von 'char'-Parametern annehmen kann, die in einem einzigen Array kombiniert werden. – RogerN

+1

In C#, wenn Sie einfache Anführungszeichen um ein einzelnes Zeichen verwenden, wird es als char interpretiert (nicht char []). Doppelte Anführungszeichen bezeichnen eine Zeichenfolge. – HitLikeAHammer

Antwort

21

The overload you're using verwendet ein parameter array, im Grunde. Das ist, was der params Teil ist. Der Compiler fügt Ihr einzelnes Argument automatisch in ein Array ein. dies so:

var x = text.Split(','); 

entspricht:

var x = text.Split(new char[] { ',' }); 

Sie können auch ein Parameter-Array für Ihre eigenen Methoden verwenden, mit dem params Stichwort:

static char GetChar(params char[] input) 
{ 
    return input[0]; 
} 

Beachten Sie, dass die Parameter-Array muss der endgültige Parameter sein. Deshalb ist die Überlast, die Sie verwenden, die nur Überlastung von Split, um ein Parameterarray zu verwenden. Schauen Sie sich die anderen Überlastungen:

Split(Char[], Int32) 
Split(Char[], StringSplitOptions) 
Split(String[], StringSplitOptions) 
Split(Char[], Int32, StringSplitOptions) 
Split(String[], Int32, StringSplitOptions) 

In jedem dieser Fälle ist das Array der erste Parameter ist, so müssen Sie konstruieren ein Array selbst:

var x = text.Split(new char[] { ',' }, 10); // Call the (char[], int) overload 

oder mit einem implizit typisierte Array:

var x = text.Split(new[] { ',' }, 10); // Call the (char[], int) overload 
4

Die tatsächliche Überladung, die this one genannt wird, ist. Beachten Sie, dass die Kopfzeile am oberen Rand der Seite irreführend ist, es dauert params char[] statt char[]. Auf diese Weise können Sie Trennzeichen wie "my, string".Split(',', ' ') übergeben, anstatt Sie zuerst durch den Rahmen der Verwendung von "my, string".Split(new char[] { ',', ' ' }) zu springen.