Quelle est la différence entre un constructeur public dans une classe interne et interne constructeur?
J'ai une classe interne, interne constructeur de ne pas lui permettre d'être utilisé dans une collection générique alors je l'ai changé pour le public. Ce qui est de l'accessibilité si vous avez un constructeur public dans une classe interne et est-ce différent à l'intérieur du constructeur?
Vous devez vous connecter pour publier un commentaire.
Les deux sont essentiellement les mêmes. Un argument que j'ai vu pour faire la distinction entre eux est que votre constructeur
internal
assure le type ne jamais être instancié par les types à l'intérieur de l'actuelle assemblée, même si c'est plus tard a décidé que le type lui-même devrait êtrepublic
au lieu deinternal
. En d'autres mots, vous pouvez décider de changer le type de visibilité sans la levée des restrictions sur son instanciation.Rendant le constructeur
public
a l'effet inverse (évidemment), et peut-être judicieux si vous souhaitez qu'il soit possible d'instancier le type de n'importe où il est visible.Aussi, comme vous l'avez déjà souligné, petit différence est que si le constructeur
internal
, le type ne peut pas être utilisé comme un argument de type générique pour un type générique avec unwhere T : new()
contrainte, que cette contrainte nécessite pour le constructeur pour êtrepublic
.Une classe publique avec un interne constructeur peut toujours être utilisé en dehors du code, si vous retournez un objet de cette classe à partir d'une fonction publique.
À l'extérieur de code a ensuite accès à cet objet, mais ne peut toujours pas créer un nouveau.
Alors qu'une classe interne ne peut pas être utilisé en dehors de l'assemblée à tous:
Intérieur ou constructeur public à un type interne serait l'équivalent en termes de visibilité.
interne constructeur sont bons quand vous ne voulez pas le client pour en créer une instance. Vous feriez habituellement voulez faire si vous voulez contrôler la façon dont l'instance devrait être créé.Vous aurez à fournir soit une Usine à générer de la classe dans une autre classe au sein de la même assemblée pour générer de l'instance en interne et l'exposer comme une propriété.
internal
, de sorte que les clients peuvent même pas voir, a fortiori, de l'instanciation.Une autre distinction importante est que pour accéder à un
internal
constructeur en utilisant la réflexion, vous devez spécifier la liaison drapeaux à votre appel à l'Type.GetConstructor()
- leType.GetConstructor(Type[])
surcharge sera seulement de retour d'un constructeur public:Ce qui pourrait être important lorsque vous utilisez une bibliothèque qui utilise le
Type.GetConstructor(Type[])
de surcharge, comme Microsoft l'Unité.