web-dev-qa-db-fra.com

Classe statique C # pourquoi utiliser?

Duplicata possible:
Quand utiliser des classes statiques en C #

Je définis souvent mes classes comme statiques, mais je ne sais pas quand utiliser statiques ou non, ni quelle différence cela fait de les utiliser ou non.

quelqu'un peut-il expliquer s'il vous plaît?

22
ShadowG

Rendre une classe statique empêche simplement les gens d'essayer d'en créer une instance. Si tout votre classe a des membres statiques, il est recommandé de rendre la classe elle-même statique.

31
Dylan Smith

Si une classe est déclarée comme statique, les variables et les méthodes doivent obligatoirement être déclarées comme statiques.

Une classe peut être déclarée statique, indiquant qu'elle ne contient que des membres statiques. Il n'est pas possible de créer des instances d'une classe statique à l'aide du nouveau mot clé. Les classes statiques sont chargées automatiquement par le Common Language Runtime (CLR) .NET Framework lorsque le programme ou l'espace de noms contenant la classe est chargé.

Utilisez une classe statique pour contenir des méthodes qui ne sont pas associées à un objet particulier. Par exemple, il est courant de créer un ensemble de méthodes qui n'agissent pas sur les données d'instance et ne sont pas associées à un objet spécifique dans votre code. Vous pouvez utiliser une classe statique pour conserver ces méthodes.

-> Les principales caractéristiques d'une classe statique sont:

  • Ils ne contiennent que des membres statiques.
  • Ils ne peuvent pas être instanciés.
  • Ils sont scellés.
  • Ils ne peuvent pas contenir de constructeurs d'instance ou simplement des constructeurs car nous savons qu'ils sont associés à des objets et opèrent sur des données lors de la création d'un objet.

Exemple

static class CollegeRegistration
{
  //All static member variables
   static int nCollegeId; //College Id will be same for all the students studying
   static string sCollegeName; //Name will be same
   static string sColegeAddress; //Address of the college will also same

    //Member functions
   public static int GetCollegeId()
   {
     nCollegeId = 100;
     return (nCollegeID);
   }
    //similarly implementation of others also.
} //class end


public class student
{
    int nRollNo;
    string sName;

    public GetRollNo()
    {
       nRollNo += 1;
       return (nRollNo);
    }
    //similarly ....
    public static void Main()
   {
     //Not required.
     //CollegeRegistration objCollReg= new CollegeRegistration();

     //<ClassName>.<MethodName>
     int cid= CollegeRegistration.GetCollegeId();
    string sname= CollegeRegistration.GetCollegeName();


   } //Main end
}
15
Enigma State

Les classes statiques peuvent être utiles dans certaines situations, mais il existe un risque d'abus et/ou de surutilisation, comme la plupart des fonctionnalités de langage.

Comme Dylan Smith l'a déjà mentionné, le cas le plus évident pour utiliser une classe statique est si vous avez une classe avec uniquement des méthodes statiques. Il est inutile de permettre aux développeurs d'instancier une telle classe.

La mise en garde est qu'une surabondance de méthodes statiques peut elle-même indiquer un défaut dans votre stratégie de conception. Je trouve que lorsque vous créez une fonction statique, il est bon de vous demander - serait-il mieux adapté soit comme a) une méthode d'instance, soit b) comme méthode d'extension à une interface. L'idée ici est que les comportements des objets sont généralement associés à l'état de l'objet, ce qui signifie que le comportement doit appartenir à l'objet. En utilisant une fonction statique, vous indiquez que le comportement ne doit pas appartenir à un objet particulier.

La conception polymorphe et pilotée par interface est entravée par la surutilisation des fonctions statiques - elles ne peuvent pas être remplacées dans les classes dérivées ni attachées à une interface. Il est généralement préférable que vos fonctions "d'assistance" soient liées à une interface via une méthode d'extension de sorte que toutes les instances de l'interface aient accès à cette fonctionnalité "d'assistance" partagée.

Une situation où les fonctions statiques sont certainement utiles, à mon avis, consiste à créer une méthode .Create () ou .New () pour implémenter la logique de création d'objet, par exemple lorsque vous souhaitez proxyer l'objet en cours de création,

public class Foo
{
    public static Foo New(string fooString)
    {
        ProxyGenerator generator = new ProxyGenerator();

        return (Foo)generator.CreateClassProxy
             (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    }

Cela peut être utilisé avec un framework de proxy (comme Castle Dynamic Proxy) où vous souhaitez intercepter/injecter des fonctionnalités dans un objet, en fonction, par exemple, de certains attributs attribués à ses méthodes. L'idée générale est que vous avez besoin d'un constructeur spécial, car techniquement, vous créez une copie de l'instance d'origine avec des fonctionnalités supplémentaires spéciales.

3
Sean Thoman