352 votes

Equivalent de typedef en C #

Est-il une définition de type équivalent en C#, ou d'une certaine manière pour obtenir une sorte de comportement similaire? J'ai fait quelques recherches sur google, mais partout où je regarde, semble être négative. Actuellement, j'ai une situation similaire à la suivante:

class GenericClass<T> 
{
    public event EventHandler<EventData> MyEvent;
    public class EventData : EventArgs { /* snip */ }
    // ... snip
}

Maintenant, il ne prend pas un scientifique pour comprendre que cela peut très rapidement conduire à beaucoup de saisie (toutes mes excuses pour l'horrible jeu de mots) lorsque l'on tente de mettre en œuvre un gestionnaire pour l'événement. Il finirais quelque chose comme ceci:

GenericClass<int> gcInt = new GenericClass<int>;
gcInt.MyEvent += new EventHandler<GenericClass<int>.EventData>(gcInt_MyEvent);
// ...

private void gcInt_MyEvent(object sender, GenericClass<int>.EventData e)
{
    throw new NotImplementedException();
}

Sauf que, dans mon cas, j'étais déjà à l'aide d'un type complexe, et pas seulement un int. Ça serait bien si c'était possible de le simplifier un peu...

Edit: c'est à dire. peut-être typedefing le Gestionnaire d'événements au lieu d'avoir à les redéfinir pour obtenir un comportement similaire.

369voto

Jon Skeet Points 692016

Non, il n'y a pas d'équivalent de typedef. Vous pouvez utiliser l'utilisation de directives dans un fichier, par exemple

 using CustomerList = System.Collections.Generic.List<Customer>;
 

mais cela n'aura d'impact que sur ce fichier source.

Heureusement, l'exemple que vous donnez a une solution - conversion de groupe méthode implicite. Vous pouvez changer votre ligne d'abonnement à seulement:

 gcInt.MyEvent += gcInt_MyEvent;
 

:)

42voto

Jon a vraiment donné une bonne solution, je ne savais pas que tu pouvais faire ça!

Parfois, j'ai eu recours à l'héritage de la classe et à la création de ses constructeurs. Par exemple

 public class FooList : List<Foo> { ... }
 

Pas la meilleure solution (à moins que votre assemblage ne soit utilisé par d'autres personnes), mais cela fonctionne.

19voto

palswim Points 4353

Si vous savez ce que vous faites, vous pouvez définir une classe avec des opérateurs implicites à convertir entre la classe d'alias et la classe réelle.

 class TypedefString // Example with a string "typedef"
{
    private string Value = "";
    public static implicit operator string(TypedefString ts)
    {
        return ((ts == null) ? null : ts.Value);
    }
    public static implicit operator TypedefString(string val)
    {
        return new TypedefString { Value = val };
    }
}
 

Je n'approuve pas cela et je n'ai jamais utilisé quelque chose comme ça, mais cela pourrait probablement marcher dans certaines circonstances.

6voto

OregonGhost Points 16615

Je pense qu'il n'y a pas de typedef. Vous pouvez uniquement définir un type délégué au lieu de le générique dans la GenericClass, c'est à dire

public delegate GenericHandler EventHandler<EventData>

Cela permettrait de faire plus court. Mais que dire de la suggestion suivante:

L'Utilisation De Visual Studio. De cette façon, quand vous avez tapé

gcInt.MyEvent +=

il assure déjà le gestionnaire d'événement complet signature de l'Intellisense. Appuyez sur TAB et il est là. Accepter l'généré nom du gestionnaire ou de la modifier, puis appuyez sur TAB pour générer automatiquement le gestionnaire de stub.

6voto

Keith Points 46288

C # prend en charge une covariance héritée pour les délégués d'événements, donc une méthode comme celle-ci:

 void LowestCommonHander( object sender, EventArgs e ) { ... } 
 

Peut être utilisé pour vous abonner à votre événement, pas de distribution explicite requise

 gcInt.MyEvent += LowestCommonHander;
 

Vous pouvez même utiliser la syntaxe lambda et l'intellisense sera tout fait pour vous:

 gcInt.MyEvent += (sender, e) =>
{
    e. //you'll get correct intellisense here
};
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X