2009-11-06 8 views
0

en C++, il est possible d'ignorer l'identificateur de paramètre de méthode si elle est utilisé:Paramètres sans identificateur en C#?

void foo(int, int) {} 

Ceci est très utile en cas d'implémentations d'interface où un grand nombre de méthode a le corps vide. Est-il possible de faire quelque chose de similaire en C#? Le test direct donne une erreur:

public void OnAddInsUpdate(ref Array) {} // Error, need identifier :(
+0

Interfaces impliquent que vous devez mettre en œuvre toutes les méthodes par définition. Vous pouvez en faire une classe abstraite avec une implémentation vide des méthodes "inutilisées", en laissant abstrait celles dont vous avez besoin pour être implémentées. –

Répondre

3

Ceci n'est pas supporté par le langage C#.

3

Je ne crois pas que ce soit possible. Si vous avez des paramètres inutilisés, vous devriez probablement considérer la surcharge ou les paramètres nommés (nouveau dans C# 4.0).

1

Il n'est pas possible de fournir le nom du paramètre en C#, cependant, je ne vois pas ce qui ne va pas avec une vérification dans la méthode pour voir si elle a été définie par ex.

public void OnAddInsUpdate(int x, int? y) 
{ 
    // do something with x 
    if (y != null) 
     // do something with y 
} 

C# 4.0 introduit Optional Parameters.

+0

int n'est pas un objet donc je ne pense pas que vous pouvez l'envoyer nul. Vous obtiendrez une erreur de compilation. –

+0

Un entier ne sera jamais nul, un entier a toujours une valeur, 0 par défaut. –

+0

Vous pouvez utiliser les types Nullable – James

1

Votre exemple d'un événement avec un certain nombre d'arguments devrait effectivement être fait en utilisant EventArgs.

Ceci présente un certain nombre d'avantages. La première étant que vous pouvez passer par un grand nombre de valeurs potentielles, mais seulement remplir celles qui sont pertinentes. L'avantage supplémentaire est que vous pouvez, à un stade ultérieur, ajouter d'autres valeurs sans modifier la signature de l'événement et exiger que tous les consommateurs soient mis à jour.

Ainsi, par exemple:

public void OnAddInsUpdate(AddInsUpdateEventArgs e) { } 

public class AddInsUpdateEventArgs : EventArgs 
{ 
    public int x { get; } // Readonly for event handler 
    public int? y { get; set; } // Read/Write (eg if you can accept values back) 
    public bool? Handled { get; set; } 
} 
0

Peut-être que l'utilisation de params vous donnera ce que vous voulez:

public class MyClass 
{ 

    public static void UseParams(params int[] list) 
    { 
     for (int i = 0 ; i < list.Length ; i++) 
     Console.WriteLine(list[i]); 
     Console.WriteLine(); 
    } 

    public static void UseParams2(params object[] list) 
    { 
     for (int i = 0 ; i < list.Length ; i++) 
     Console.WriteLine(list[i]); 
     Console.WriteLine(); 
    } 

    public static void Main() 
    { 
     UseParams(1, 2, 3); 
     UseParams2(1, 'a', "test"); 

     int[] myarray = new int[3] {10,11,12}; 
     UseParams(myarray); 
    } 
} 
Questions connexes