Quand utiliser les classes statiques en C# [dupliquer]

cette question a déjà une réponse ici:

voici ce que MSDN a à dire sous quand utiliser les Classes statiques :

static class CompanyInfo
{
    public static string GetCompanyName() { return "CompanyName"; }
    public static string GetCompanyAddress() { return "CompanyAddress"; }
    //...
}

utiliser une classe statique comme unité de mesure organisation pour les méthodes non associés à des objets particuliers. Aussi, une classe statique peut rendre votre mise en œuvre plus simple et plus rapide parce que vous n'avez pas à créer un objet afin d'appeler ses méthodes. Il est utile d'organiser les méthodes à l'intérieur de la classe de façon significative, comme les méthodes de la classe de maths dans l'espace de noms System.

Pour moi, cet exemple ne semble pas couvrir de nombreux scénarios d'utilisation pour les classes statiques. Dans le passé, j'ai utilisé des classes statiques pour des suites apatrides de fonctions connexes, mais c'est à peu près tout. Alors, dans quelles circonstances (et ne devrait pas) une classe déclarée statique?

548
demandé sur Ryan 2008-10-27 23:53:37

11 réponses

j'ai écrit mes pensées des classes statiques dans une réponse plus tôt de débordement de pile: Classe À méthode unique -- meilleure approche?

j'aimais les classes d'utilité remplies de méthodes statiques. Ils ont fait une grande consolidation des méthodes d'aide qui autrement se trouver autour de causer la redondance et l'enfer d'entretien. Ils sont très faciles à utiliser, pas d'instanciation, pas de disposition, juste du feu et de l'oubli. Je suppose que c'était ma première tentative involontaire de créer une architecture axée sur le service-beaucoup de services apatrides qui ont juste fait leur travail et rien d'autre. Au fur et à mesure qu'un système se développe, les dragons arrivent.

polymorphisme

disons que nous avons la méthode UtilityClass.SomeMethod qui heureusement se met à vibrer. Soudainement, nous avons besoin de changer légèrement la fonctionnalité. La plupart des fonctionnalités sont les mêmes, mais nous devons néanmoins changer quelques parties. Avoir ce n'était pas une méthode statique, nous pourrions faire une classe derivate et changer le contenu de la méthode si nécessaire. Comme c'est une méthode statique, on ne peut pas. Bien sûr, si nous avons juste besoin d'ajouter des fonctionnalités avant ou après l'ancienne méthode, nous pouvons créer une nouvelle classe et appeler l'ancienne à l'intérieur de celle - ci-mais c'est juste grossier.

problèmes D'Interface

les méthodes statiques ne peuvent pas être définies par des interfaces pour des raisons de logique. Et puisque nous ne pouvons pas remplacer les méthodes statiques, les classes statiques sont inutiles quand nous avons besoin de passer par leur interface. Cela nous rend incapables d'utiliser des classes statiques dans le cadre d'un schéma de stratégie. Nous pourrions corriger quelques problèmes par passer délégués au lieu d'interfaces .

Test

cela va essentiellement main dans la main avec les problèmes d'interface mentionnés ci-dessus. Comme notre capacité d'interchanger des implémentations très limité, nous aurons également du mal à remplacer le code de production par le code de test. Encore une fois, nous pouvons les emballer, mais cela nous obligera à changer de grandes parties de notre code juste pour être en mesure d'accepter des emballages au lieu des objets réels.

Favorise les blobs

comme les méthodes statiques sont généralement utilisés comme les méthodes d'utilité et les méthodes d'utilité aura généralement des buts différents, nous allons rapidement se retrouver avec une grande classe remplie de fonctionnalité non cohérente-idéalement, chaque classe devrait avoir un but unique au sein du système. Je préférerais avoir cinq fois plus de cours tant que leurs buts sont bien définis.

"1519100920 Paramètre" fluage

pour commencer, cette petite méthode statique mignonne et innocente pourrait prendre un seul paramètre. Au fur et à mesure que la fonctionnalité augmente, quelques nouveaux paramètres sont ajoutés. Bientôt, d'autres paramètres sont ajoutés qui sont optionnelles, nous créez des surcharges de la méthode (ou ajoutez simplement des valeurs par défaut, dans les langues qui les supportent). Avant longtemps, nous avons une méthode qui prend 10 paramètres. Seuls les trois premiers sont vraiment nécessaires, les paramètres de 4-7 sont facultatifs. Mais si le paramètre 6 est spécifié, 7-9 doivent être remplis... Si nous avions créé une classe avec le seul but de faire ce que cette méthode statique a fait, nous pourrions résoudre cela en prenant les paramètres requis dans le constructeur, et en permettant à l'utilisateur de définir optionnel des valeurs par des propriétés, ou des méthodes pour fixer des valeurs interdépendantes multiples en même temps. En outre, si une méthode a grandi à cette quantité de complexité, il est très probable qu'elle doit être dans sa propre classe de toute façon.

exiger des consommateurs de créer une instance de classes sans raison

L'un des arguments les plus courants est: pourquoi exiger que les consommateurs de notre classe créent une instance pour invoquer cette méthode unique, tout en n'ayant pas utiliser pour l'instance après? Créer une instance d'une classe est une opération très bon marché dans la plupart des langues, donc la vitesse n'est pas un problème. L'ajout d'une ligne de code supplémentaire au consommateur est peu coûteux pour jeter les bases d'une solution beaucoup plus durable à l'avenir. Et enfin, si vous voulez éviter de créer des instances, créez simplement une enveloppe unique de votre classe qui permet une réutilisation facile - bien que cela rende la condition que votre classe soit apatride. Si ce n'est pas apatride, vous pouvez encore créer des méthodes d'emballage statiques qui gèrent tout, tout en vous donnant tous les avantages à long terme. Enfin, vous pouvez également faire une classe qui cache l'instanciation comme si c'était un singleton: MyWrapper.Instance est une propriété qui retourne juste new MyClass();

Seulement un Sith traite dans l'absolu

bien sûr, il y a des exceptions à mon aversion pour les méthodes statiques. Véritables classes d'utilité qui ne pas poser de risque de gonfler sont d'excellents cas pour les méthodes statiques-système.Convertissez comme un exemple. Si votre projet est unique et ne nécessite aucune maintenance, l'architecture globale n'est pas très importante-statique ou non statique, peu importe - mais la vitesse de développement est importante.

les Normes, les standards, les normes!

L'utilisation de méthodes d'instance ne vous empêche pas d'utiliser aussi static méthodes, et vice versa. Tant qu'il y a un raisonnement derrière la différenciation et c'est standardisé. Il n'y a rien de pire que de regarder au-dessus d'une couche d'affaires s'étendant avec différentes méthodes de mise en œuvre.

655
répondu Mark S. Rasmussen 2017-05-23 11:33:27

au moment de décider si une classe doit être statique ou non, vous devez examiner les informations que vous tentez de représenter. Cela implique un style de programmation plus " Ascendant " où vous vous concentrez sur les données que vous représentez en premier. Est-ce que la classe que vous écrivez est un objet réel comme une pierre, ou une chaise? Ces choses sont physiques et ont des attributs physiques tels que la couleur, le poids qui vous dit que vous pouvez vouloir instancier plusieurs objets avec des propriétés différentes. Je veux peut-être une chaise noire et une chaise rouge en même temps. Si vous avez besoin de deux configurations en même temps, alors vous savez instantanément que vous voudrez l'instancier comme un objet afin que chaque objet puisse être unique et exister en même temps.

de l'autre côté, les fonctions statiques tendent à prêter davantage aux actions qui n'appartiennent pas à un objet du monde réel ou à un objet que vous pouvez facilement représenter. Rappelez-vous que les prédécesseurs de C#sont C++ et C où vous pouvez il suffit de définir des fonctions globales qui n'existent pas dans une classe. Cela prête davantage à la programmation top-down ". Des méthodes statiques peuvent être utilisées pour ces cas où il n'est pas logique qu'un "objet" exécute la tâche. En vous forçant à utiliser des classes, cela rend juste plus facile de grouper les fonctionnalités liées qui vous aident à créer du code plus maintenable.

la plupart des classes peuvent être représentées par statique ou non statique, mais en cas de doute, il suffit de revenir en arrière à vos racines OOP et essayer de penser à ce que vous représentez. Est-ce un objet qui exécute une action (une voiture qui peut accélérer, ralentir, tourner) ou quelque chose de Plus Abstrait (comme afficher la sortie).

entrez en contact avec votre OOP intérieur et vous ne pouvez jamais vous tromper!

131
répondu Despertar 2013-06-14 14:27:50

De C# 3.0, les méthodes d'extension ne peut exister que dans le haut-niveau statique de la classe.

35
répondu Mark Cidade 2008-10-27 21:04:11

si vous utilisez des outils d'analyse de code (par exemple FxCop ), il vous sera recommandé de marquer une méthode static si cette méthode n'accède pas aux données des instances. La justification est qu'il y a un gain de rendement. MSDN: CA1822-marquer les membres comme statiques .

C'est plus un guide qu'une règle, vraiment...

21
répondu user25306 2018-06-03 08:27:06

j'ai tendance à utiliser des classes pour les usines. Par exemple, il s'agit de la classe logging dans un de mes projets:

public static class Log
{
   private static readonly ILoggerFactory _loggerFactory =
      IoC.Resolve<ILoggerFactory>();

   public static ILogger For<T>(T instance)
   {
      return For(typeof(T));
   }

   public static ILogger For(Type type)
   {
      return _loggerFactory.GetLoggerFor(type);
   }
}

vous avez peut-être même remarqué que IoC est appelé avec un accesseur statique. Plus du temps pour moi, si vous pouvez appeler les méthodes statiques de la classe, c'est tout ce que vous pouvez faire pour que je marque de la classe statique pour plus de clarté.

12
répondu Rob 2008-10-27 21:11:55

j'ai commencé à utiliser des classes statiques quand je souhaite utiliser des fonctions, plutôt que des classes, comme mon unité de réutilisation. Auparavant, j'étais tout au sujet du mal des classes statiques. Cependant, apprendre F# m'a fait les voir dans une nouvelle lumière.

Qu'est-ce que je veux dire par là? Eh bien, disons qu'en travaillant sur un super code sec , je finis avec un tas de classes à une seule méthode. Je peux juste tirer ces méthodes dans une classe statique et puis injecter ils deviennent des dépendances en utilisant un délégué. Cela se passe aussi bien avec mon injection de dépendance (DI) conteneur de choix Autofac.

bien sûr, prendre une dépendance directe sur une méthode statique est encore habituellement mal (Il ya quelques utilisations non-mal).

10
répondu bentayloruk 2016-08-03 16:39:50

classes Statiques sont très utiles et ont une place, par exemple les bibliothèques.

le meilleur exemple que je puisse fournir est la classe.Net Math, une classe statique d'espace de noms système qui contient une bibliothèque de fonctions mathématiques.

C'est comme n'importe quoi d'autre, utiliser le bon outil pour le travail, et si rien ne peut être abusé.

rejeter aveuglément les classes statiques comme fausses, ne pas les utiliser, ou en disant "Il ne peut y avoir qu'une" ou Aucune, est aussi mal que sur l'aide de la leur.

C#.Net contient un certain nombre de classes statiques qui est utilise tout comme la classe de mathématiques.

donc, étant donné la mise en œuvre correcte, ils sont extrêmement utiles.

nous avons une classe de fuseau horaire statique qui contient un certain nombre de fonctions de fuseau horaire liées aux affaires, il n'est pas nécessaire de créer plusieurs instances de la classe tellement comme la classe de mathématiques, il contient un ensemble de fuseau horaire globalement accessible fonctions réalisées (méthodes) dans une classe statique.

9
répondu Don 2013-12-15 13:13:30

j'utilise des classes statiques comme moyen de définir une" fonctionnalité supplémentaire " qu'un objet d'un type donné pourrait utiliser dans un contexte spécifique. D'habitude, ce sont des classes d'utilité.

autrement, je pense que " Utiliser une classe statique comme unité d'organisation pour des méthodes non associées à des objets particuliers."décrire assez bien leur usage prévu.

8
répondu Trap 2008-10-27 21:05:24

c'est une autre vieille mais très chaude question depuis que OOP a commencé. Il existe de nombreuses raisons d'utiliser(ou non) d'une classe statique, bien sûr, et la plupart d'entre eux ont été couverts dans la multitude de réponses.

je vais juste ajouter mes 2 cents à cela, en disant que, je fais une classe statique, quand cette classe est quelque chose qui serait unique dans le système et qui ne ferait vraiment aucun sens d'avoir des exemples de cela dans le programme. Cependant, je réserve cette utilisation pour les grandes classes. Je ne déclarez jamais des classes aussi petites que dans L'exemple MSDN comme "statiques" et certainement pas des classes qui vont être membres d'autres classes.

j'aime aussi noter que les" méthodes statiques et les "classes statiques sont deux choses différentes à considérer. Les principaux inconvénients mentionnés dans la réponse acceptée concernent les méthodes statiques 151960920". static classes offrent la même flexibilité que classes normales(où les propriétés et les paramètres sont concernés), et toutes les méthodes utilisées doivent être pertinentes pour les fins de l'existence de la classe.

un bon exemple, à mon avis, d'un candidat pour une classe statique est une classe de" traitement de fichiers", qui contiendrait toutes les méthodes et propriétés pertinentes pour les divers objets du programme pour effectuer des opérations complexes de traitement de fichiers. Il n'a guère de sens d'avoir plus d'une instance de cette classe et être static le rendra facilement disponible pour tout dans votre programme.

7
répondu ThunderGr 2014-10-17 07:46:33

Je n'utilise que des classes statiques pour les méthodes d'aide, mais avec L'avènement de C # 3.0, je préfère utiliser des méthodes d'extension pour celles-ci.

j'utilise rarement les méthodes des classes statiques pour les mêmes raisons que j'utilise rarement le"design pattern" de singleton.

2
répondu jonnii 2008-10-27 21:00:33

basé sur MSDN :

  1. vous ne pouvez pas créer l'instance pour les classes statiques
  2. si la classe déclarée comme statique, la variable de membre doit être statique pour cette classe
  3. scellé [ne peut être hérité]
  4. ne peut pas contenir le constructeur d'Instance
  5. Gestion De La Mémoire

exemple: calculs mathématiques (valeurs mathématiques)) does not changes [STANDARD CALCULATION FOR DEFINED VALUES]

2
répondu Vicky 2014-12-30 21:19:00