2013-07-29 18 views
6

Perché "my,string".Split(',') funziona in .NET C#?Perché "my, string" .Split (',') funziona in .NET C#

La dichiarazione di Split secondo MSDN è Split(Char[]). MSDN String.Split Method

Suppongo che C# 5 converta il singolo carattere ',' in char[] {','}; ma devo essere sbagliato perché il seguente codice non funziona:

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

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

EDIT: Grazie per la risposta di Jon Skeet ho cambiato l'argomento params char[] e funziona dimostrando il concetto.

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

Nota la parola chiave 'params' sul prototipo del metodo' Split', che indica che il metodo può assumere un numero variabile di parametri 'char' che saranno combinati in un singolo array. – RogerN

+1

In C#, quando si usano virgolette singole attorno a un singolo carattere, viene interpretato come un carattere (non char []). Le doppie virgolette denotano una stringa. – HitLikeAHammer

risposta

21

Il overload you're using utilizza un parameter array, in fondo. Questo è ciò che è la parte params. Il compilatore avvolge automaticamente il tuo singolo argomento in un array. Quindi questo:

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

è equivalente a:

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

È possibile utilizzare una matrice di parametri per i propri metodi di troppo, la parola params:

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

Si noti che la matrice di parametri deve essere il parametro finale. Questo è il motivo per cui il sovraccarico che stai utilizzando è il solo sovraccarico di Split per utilizzare un array di parametri. Guarda le altre sovraccarichi:

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

In ciascuno di questi casi, la matrice è il parametro prima, in modo da avere per costruire una matrice da soli:

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

o utilizzando un implicitamente tipizzato matrice:

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

Il sovraccarico effettivo che viene chiamato è this one. Si noti che l'intestazione nella parte superiore della pagina è fuorviante, in realtà richiede params char[] anziché char[]. Ciò consente di passare i separatori come "my, string".Split(',', ' ') invece di farti saltare attraverso il telaio utilizzando "my, string".Split(new char[] { ',', ' ' }) prima.