8
votes

Quelle est la différence entre C # et CLI lorsqu'il s'agit de types de valeur et de constructeurs?

J'ai lu récemment que les normes C # et CLI définissent différentes manières de gérer des types de valeur et des constructeurs.

Selon les types de valeurs de spécification CLI ne peut pas avoir de constructeurs sans paramètre, alors que dans les types de valeur de spécification C # ont un constructeur sans paramètre par défaut. Si, selon la spécification CLI, vous devez créer une valeur sans spécifier de paramètres, il y a une instruction spéciale pour le faire.

Alors mes questions sont

  • Pourquoi les concepteurs C # étriendraient intentionnellement de la norme CLI - quel avantage était là pour cela, et pourquoi le CLI ne permet pas à cette fonctionnalité?
  • Dans mon expérience limitée, chaque fois que je me trouve à l'aide d'une "instruction spéciale" pour permettre la fonctionnalité qui n'était pas initialement destinée, c'est généralement un peu de hack. Comment est-ce différent?

5 commentaires

Avez-vous examiné le code à l'aide du réflecteur?


Non, je n'ai pas de code spécifique pour regarder comme telle, je basse la question sur quelque chose que j'ai lu


Par intérêt, où l'avez-vous lu? Je sais que c'est quelque chose que j'ai souligné plusieurs fois, mais je n'ai pas vu beaucoup d'autres personnes le mentionnent.


@Jon, je l'ai lu en fait dans votre livre - je ne voulais pas citer le livre directement parce que je pensais que cela pourrait influencer les réponses à la question ... comme si la dernière investissement de Warren Buffet est publiée, le stock tire immédiatement UP en valeur! J'espère que ça ne vous dérange pas.


Pas un problème du tout. J'étais juste curieux :)


3 Réponses :


0
votes

alors que dans les types de valeur de spécification C # ont un constructeur sans paramétrage par défaut

que vous ne pouvez pas changer. L'effet est donc pareil, juste défini différemment.


0 commentaires

7
votes

Dans divers endroits, il est logique d'un point de vue em> consistant à penser à des types de valeur comme ayant un constructeur sans paramètre. Vous pouvez toujours créer une valeur sans fournir d'arguments, et c'est vrai dans la CLI et C #. Dans C #, vous pouvez simplement utiliser la syntaxe de constructeur standard:

public void Foo<T>() where T : new()
{
    T t = new T();
}


0 commentaires

0
votes

Une distinction importante entre les types de valeur et les types de classe est que les instances de type classe, contrairement aux instances de type de valeur, ne peuvent être apportées qu'en appelant un constructeur et ne seront pas exposés au monde extérieur jusqu'à ce que le constructeur soit terminé. ou expose explicitement l'objet en construction. En revanche, les instances de type de valeur seront apportées à l'existence de la création d'une instance de struct ou de type de classe enfermante avec un champ de type de valeur ou par la création d'un tableau d'éléments de type valeur. Bien qu'il n'y aurait pas de raison technique pour laquelle Microsoft n'aurait pas pu définir des constructeurs sans paramètres explicites pour être définis pour les structures, il aurait été difficile de garantir que chaque structure disposera de son constructeur sans paramétrole avant d'être exposé au monde extérieur, et cela aurait été déroutant d'avoir un tel constructeur gérer dans certaines situations mais pas d'autres.


0 commentaires