2010-09-16 6 views
9

Je considérais toujours les structures comme des sortes de choses moins privilégiées, ou quelque chose avec des fonctionnalités moindres. Peut-être à cause des concepts OOP qui soufflent tout dans les Classes. De la petite quantité d'exposition à C#, je comprends que la définition d'une classe statique, s'assure que toutes ses fonctions & sont statiques. Nous ne pouvons pas non plus avoir de constructeur pour initialiser cette classe car il n'y a qu'une seule instance. J'ai été souligné ici à Stack overflow que c'est une mauvaise méthode. Quelqu'un peut-il élaborer.Pourquoi les structures statiques ne sont pas autorisées en C#?

J'ai eu l'erreur appropriée en disant "statique n'est pas valide pour cet article" quand j'ai créé un nouveau fichier cs & compilé dans la console. Etrangement quand j'ai ajouté ceci à un projet de travail existant pour voir si le compilateur se plaindrait mais à ma grande surprise ce n'est pas le cas. Des raisons pour cela ??

+6

En C#, 'static' est un alias pour' abstraite sealed' sur une déclaration de type (il permet également d'autres contrôles de compilation comme la fabrication des méthodes sûres sont statique aussi). Puisque les structures sont des types de valeurs et n'autorisent pas le comportement polymorphe, il est logique que 'static' ne soit pas autorisé. Vous pouvez cependant avoir des membres statiques sur une structure. –

+2

@Steve: Si la classe est statique, le compilateur vérifie aussi * use * du nom du type. Par exemple, vous ne pouvez pas déclarer un paramètre de type Enumerable. Vous avez peut-être été au courant de cela, mais je voulais attirer l'attention sur elle :) –

+0

@Jon: C'est vrai - merci de me le rappeler. –

Répondre

17

Une classe statique est juste un conteneur pour les membres statiques (de tout type - champs, événements, propriétés, et le plus souvent des méthodes). Une structure statique serait exactement la même, donc ne fournirait aucun avantage - mais les lecteurs pourraient penser que cela avait une signification particulière. Pour éviter toute confusion, c'est donc interdit. Conceptuellement, il est tout aussi logique qu'une classe statique, bien sûr - la différence entre les structures et les classes est vraiment en termes de comportement, et comme il n'y aurait pas de cas de types statiques de l'une ou de l'autre sorte, cette différence serait sans intérêt.

(Pas que je sois dans la réunion de design où cela a été décidé, bien sûr, Eric Lippert pourrait bien être en mesure de trouver quelques notes à ce sujet.) Ce qui précède est juste une supposition éclairée. l'affaire, autant que je peux voir.)

+2

Vous voulez dire que vous n'étiez * pas * dans la réunion de conception? –

+1

@Dan: Hélas, je n'ai jamais participé à des réunions de design C#. J'aimerai * être *, bien sûr. –

+0

@Jon: Désolé, je viens de lire la phrase mal la première fois. Personnellement, je pense que je détesterais * être à une telle réunion ... trop de pression pour prendre des décisions intelligentes! –

8

Cela n'a aucun effet. Vous auriez toujours une collection de méthodes statiques comme vous le faites avec une classe statique. Une structure en C# implique qu'il s'agit d'un type de valeur au lieu d'un type de référence, ce qui n'a aucune signification au niveau statique.

1

Le concept de types statiques n'a aucun sens pour les structures. Les structures impliquent une sémantique de copie par valeur - ce qui n'a de sens que lorsque vous pouvez instancier un type. Les classes statiques ont été introduites pour faciliter le regroupement de méthodes statiques dans un type qui ne peut pas être instancié. Permettre des structures statiques serait à la fois redondant et déroutant.

Pensez-y de cette façon. Comment static class Foo et static struct Foo diffèrent dans le comportement? Et s'ils ne le font pas ... pourquoi introduire un concept static struct? Cela ne peut que créer de la confusion chez les gens en leur faisant croire qu'il y a une différence ...

+0

Je prends votre point de vue. Mais sûrement "class" implique une sémantique de copie par référence, la possibilité de créer des instances, et le partage des détails d'implémentation via l'héritage, dont aucun n'est vrai pour les classes statiques. Il n'est pas du tout évident que la classe statique soit * meilleure * que la structure statique, et c'est sans doute pire. –

+0

@Eric: En effet, il le fait ... et peut-être un troisième type de concept (module comme vous l'avez mentionné dans votre commentaire à l'article de Jon) aurait pu être mieux. Je suppose que ce que j'essayais de dire (mal), c'est qu'avoir * deux * statique et une structure statique serait déroutant et impliquerait une différence comportementale qui n'existait pas. – LBushkin

1

Parce que statique n'est pas défini pour être autorisé dans la langue à appliquer aux structures.

La classe statique définit déjà la même capacité.

+0

une raison quelconque pour l'ancien lien? –

+0

@John: Merci de l'avoir signalé. Corrigé en l'enlevant.Juste la première chose qui est apparue dans Google lorsque j'ai cherché la page de référence. –

3

Fichier sous "c'est juste comme ça". Puisque vous pouvez le faire avec une classe statique, il n'y a pas de raison d'autoriser des structures statiques. Cela ne ferait que créer la confusion chez les gens quant à la différence entre eux. Ils devaient choisir l'un ou l'autre.

3

Also we cannot have a constructor to initialize that class as there is only a single instance.

En fait, il n'y a pas instance d'une classe statique. Quel genre d'explique le manque de soutien pour les structures statiques - ou plutôt, l'absence de besoin pour une telle chose.

La distinction est tout à fait sur la façon dont cas de ces types sont traités entre les types de référence et les types de valeur dans .NET (class et struct en C#). Une instance d'un type de référence est accessible via une référence à cette instance sous la forme d'une variable. Les copies de ces références sont transmises entre les appels de méthode. Une instance d'un type de valeur est directement accessible et des copies de l'instance elle-même sont passées entre les appels de méthodes.

En l'absence d'exemple, cette distinction n'est plus pertinente; donc tout type qui consiste uniquement en membres statiques pourrait aussi bien être une classe statique.

3

Aucune instance sur le terrain Initialiseur

Dans une classe nous sommes autorisés à créer un champ/variable et l'initialiser en même temps une structure ne peut pas contenir une telle initialisation. Ces champs doivent être initialisés par des fonctions ou en utilisant l'objet lui-même. Les champs ne peuvent pas recevoir de valeurs initiales au moment de la création. Le code suivant donne une erreur:

struct Point 
{ 
    public int x = 20; // Error its not possible to initialize 
    public int y=20; // Error its not possible to initialize 
} 

Toutefois, une structure peut contenir des champs statiques, qui peuvent être initialisés dans la structure. L'exemple suivant montre l'utilisation de champs statiques dans une structure.

struct Point { 
     public static int x = 25; 
     public static int y = 50; 
} 

Struct & Méthodes

A struct C# peut également contenir des méthodes. Les méthodes peuvent être statiques ou non statiques. Mais les méthodes statiques ne peuvent accéder qu'à d'autres membres statiques et ils ne peuvent pas invoquer en utilisant un objet de la structure. Ils peuvent invoquer uniquement en utilisant le nom de la structure.

struct Point 
{  
    static int x = 25;  
    static int y = 50; 
    public void SetXY(int i, int j)  
    {   
     x = i;   
     y = j;  
    }  

    public static void ShowSum()    
    {   
     int sum = x + y;   
     Console.WriteLine("The sum is {0}",sum);  
    } 
} 

que l'on trouve sur « http://www.csharpfriends.com/articles/getarticle.aspx?articleid=120 »

Questions connexes