Question

J'ai lu des articles sur les méthodes partielles dans le dernier article Spécification du langage C#, donc je comprends les principes, mais je me demande comment les gens les utilisent réellement.Existe-t-il un modèle de conception particulier qui bénéficie des méthodes partielles ?

Était-ce utile?

La solution

Des méthodes partielles ont été introduites pour des raisons similaires à celles pour lesquelles les classes partielles étaient dans .Net 2.

Une classe partielle est une classe qui peut être divisée en plusieurs fichiers - le compilateur les construit tous dans un seul fichier au cours de son exécution.

L'avantage est que Visual Studio peut fournir un concepteur graphique pour une partie de la classe tandis que les codeurs travaillent sur l'autre.

L'exemple le plus courant est le concepteur de formulaires.Les développeurs ne veulent pas positionner les boutons, les zones de saisie, etc. à la main la plupart du temps.

  • Dans .Net 1, il s'agissait d'un code généré automatiquement dans un #region bloc
  • Dans .Net 2, celles-ci sont devenues des classes de concepteur distinctes : le formulaire est toujours une seule classe, il est simplement divisé en un fichier modifié par les développeurs et un par le concepteur du formulaire.

Cela rend la maintenance des deux beaucoup plus facile.Les fusions sont plus simples et il y a moins de risque que le concepteur de formulaire VS annule accidentellement les modifications manuelles des codeurs.

Dans .Net 3.5, Linq a été introduit.Linq dispose d'un concepteur DBML pour créer vos structures de données et qui génère un code automatique.

Le petit plus ici est que le code nécessaire pour fournir des méthodes que les développeurs pourraient vouloir remplir.

Comme les développeurs étendront ces classes (avec des fichiers partiels supplémentaires), ils ne pourront pas utiliser de méthodes abstraites ici.

L'autre problème est que la plupart du temps, ces méthodes ne seront pas appelées et appeler des méthodes vides est une perte de temps.

Méthodes vides ne sont pas optimisés.

Linq génère donc des méthodes partielles vides.Si vous ne créez pas votre propre partiel pour les compléter, le compilateur C# les optimisera simplement.

Pour qu'il puisse faire cela, les méthodes partielles renvoient toujours void.

Si vous créez un nouveau fichier Linq DBML, il générera automatiquement une classe partielle, quelque chose comme

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

Ensuite, dans votre propre fichier partiel, vous pouvez étendre ceci :

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

Si vous n'étendez pas ces méthodes, elles sont immédiatement optimisées.

Les méthodes partielles ne peuvent pas être publiques - car elles devraient alors être là pour que d'autres classes puissent les appeler.Si vous écrivez vos propres générateurs de code, je peux les voir utiles, mais sinon, ils ne sont vraiment utiles que pour le concepteur VS.

L'exemple que j'ai mentionné précédemment est une possibilité :

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

Une autre utilisation potentielle est que si vous avez une classe volumineuse et complexe répartie sur plusieurs fichiers, vous souhaiterez peut-être des références partielles dans le fichier appelant.Cependant, je pense que dans ce cas, vous devriez d’abord envisager de simplifier la classe.

Autres conseils

Les méthodes partielles ont un concept très similaire à celui du GoF Méthode de modèle modèle de comportement (Modèles de conception, p325).

Ils permettent de définir le comportement d'un algorithme ou d'une opération en un seul endroit et de l'implémenter ou de le modifier ailleurs, permettant ainsi l'extensibilité et la personnalisation.J'ai commencé à utiliser des méthodes partielles en C# 3.0 au lieu de méthodes de modèle car je pense que le code est plus propre.

Une fonctionnalité intéressante est que les méthodes partielles non implémentées n'entraînent aucune surcharge d'exécution lorsqu'elles sont compilées.

Génération de code est l’une des principales raisons pour lesquelles ils existent et l’une des principales raisons de les utiliser.


MODIFIER:Même si ce lien renvoie à des informations spécifiques à Visual Basic, les mêmes principes de base s'appliquent à C#.

Je les vois comme des événements légers.Vous pouvez avoir un fichier de code réutilisable (généralement généré automatiquement mais pas nécessairement) et pour chaque implémentation, gérer simplement les événements qui vous intéressent dans votre classe partielle.En fait, c'est ainsi qu'il est utilisé dans LINQ to SQL (et pourquoi la fonctionnalité du langage a été inventée).

Voici la meilleure ressource pour les classes partielles en C#.NET 3.0 : http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

J'essaie d'éviter d'utiliser des classes partielles (à l'exception des classes partielles créées par Visual Studio pour les fichiers de concepteur ;c'est super).Pour moi, il est plus important d’avoir tout le code d’une classe au même endroit.Si votre classe est bien conçue et représente une chose (principe de responsabilité unique), alors tout le code pour cette chose doit être au même endroit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top