2010-10-27 14 views
1

Si nous avons deux procédures:Comment les paramètres object [] seront-ils interprétés s'ils sont passés dans une autre procédure avec les paramètres object []?

public void MyFirstParamsFunction(params object[] items) 
{ 
    //do something 
    MySecondParamsFunction(items, "test string", 31415) 
} 

public void MySecondParamsFunction(params object[] items) 
{ 
    //do something 
} 

Comment deuxième procédure interpréter les items de la première? En tant qu'objets seuls ou en tant qu'objet, c'est object[]?

+1

Vous avez écrit le code. Tu ne peux pas l'essayer et te découvrir? –

+5

Cela ne me semble pas trop compliqué de créer une expérience rapide et de la comprendre par vous-même ... –

+0

J'aurais aimé connaître le programme de test rapide pour C#, car je n'ai pas encore appris la technologie PowerShell . En outre, j'ai un LINQPad, mais je ne sais pas comment l'utiliser sans LINQ dans le code de test. –

Répondre

5

object[] items sera interprété comme un paramètre object[].

2

Si vous vérifiez vous-même vous auriez remarqué qu'il est vu comme un seul objet.

Donc dans MySecondParamsFunction le paramètre items aura une longueur de 3 dans ce cas.

2

Le mot-clé params est juste un peu de sucre syntaxique.

L'appel de MyFirstParamsFunction (1, 2, 3) est identique à MyFirstParamsFunction (nouvel objet [] {1, 2, 3}). Le compilateur injecte le code pour créer le tableau derrière votre dos.

3

Cet appel:

MySecondParamsFunction(items, "test string", 31415); 

élargirons à ceci:

MySecondParamsFunction(new object[] { items, "test string", 31415 }); 

Vous aurez 3 articles dans votre tableau params pour l'appel. Votre tableau original items sera entassé dans le premier élément de la nouvelle matrice.

Si vous voulez avoir juste une liste de paramètres aplati allant dans la deuxième méthode, vous pouvez ajouter les nouveaux éléments à l'ancien tableau en utilisant quelque chose comme ceci:

MySecondParamsFunction(
    items.Concat(new object[] { "test string", 31415 }).ToArray()); 

Ou peut-être avec une plus belle méthode d'extension:

MySecondParamsFunction(items.Append("test string", 31415)); 

// ... 

public static class ArrayExtensions { 
    public static T[] Append<T>(this T[] self, params T[] items) { 
    return self.Concat(items).ToArray(); 
    } 
} 
+0

+1 Merci, c'était très utile! –