2010-10-08 2 views
0

Quelle est la raison pour laquelle je dois faire les deux pour les bibliothèques standard? Pour tous les autres langages que j'ai utilisés, je n'ai besoin que d'un pour accéder aux bibliothèques standards.Pourquoi les bibliothèques standard pour C# ont-elles besoin à la fois d'une référence d'assembly et d'une importation?

+0

C# est loin d'être unique en cela. Java et C++ ont tous deux ceci. C++ est encore pire, en ce que vous * devez * faire les deux: dites à l'éditeur de liens à propos de la bibliothèque, et ajoutez un '# include'. –

+0

@Martinho: Mais pas pour les bibliothèques standard en C++ – Casebash

+2

sûr. Vous pourriez dire que la même chose se passe en C#, sauf que l'ensemble des bibliothèques auto-référencées est plus petit: seulement mscorlib.dll et System.dll, je pense. –

Répondre

9

Une référence d'assembly rend le code de l'assembly disponible à un autre assembly. Une directive using permet aux types d'un autre espace de noms d'accéder à un fichier source donné. Ce sont des concepts complètement distincts. Si vous étiez enclin, vous pouvez vous en tirer sans utiliser la directive usings et en utilisant des noms de types complets. De même, il est possible d'utiliser la directive usings pour faire référence à d'autres espaces de noms dans le même ensemble.

De plus, il existe un analogue parfait entre les assemblages/pots et les utilisations/importation entre Java et C# pour les besoins de cette discussion. Donc C# est à peine unique ici.

+0

Eh bien, le compilateur C# pourrait automatiquement référencer tous les assemblages dans le GAC qui contiennent des classes dans un espace de noms importé par une directive 'using'. C'est ce que Java fait (regardez dans tous les jars du chemin de la classe pour les types dans les paquets importés). – dtb

+0

@dtb, IMO, en passant le classpath à vos bibliothèques à java.exe est l'équivalent des références d'assemblage - bien que je sois d'accord avec votre point qu'en C# il est granulaire par projet. –

+3

Pour éviter toute confusion: l'utilisation ** statement ** est celle utilisée avec IDisposable pour l'élimination déterministe des ressources. La directive ** ** est la vedette ici. –

1

Visual Studio a besoin de certains attributs d'une référence pour décider comment le résoudre lors de l'exécution et comment le déployer lors de la construction du projet. Ces options ne peuvent pas être impliquées par une simple déclaration d'importation.

+0

Pourriez-vous entrer dans plus de détails? – Casebash

+1

Bien sûr. Je viens d'ouvrir VS et créé un nouveau projet C# (Windows Forms). Le modèle par défaut de ce projet fait référence à un certain nombre d'assemblys système. Si vous cliquez avec le bouton droit de la souris et choisissez Propriétés, une grille de propriétés s'ouvre ci-dessous, et elle détaille toutes les différentes options pour traiter cette référence. Les plus importants ont à voir avec si la référence est copiée dans le dossier bin du projet (et ensuite probablement inclus dans un programme d'installation groupé), ou si la référence doit être résolue via le GAC. En outre, il détermine le type de liaison de version, c'est-à-dire s'il nécessite cette version spécifique ou non. – Marco

1

Vous devez référencer les assemblys pour indiquer au compilateur l'emplacement des types exportés. Vous n'avez pas besoin d'inclure des espaces de noms, mais cela facilite la lecture du code car vous pouvez éviter les noms complets. De plus, étant donné que chaque assembly peut exposer plusieurs espaces de noms, il constitue un moyen pratique de regrouper les types associés.

2

Les références d'assemblage sont un concept de la plate-forme, tandis qu'une importation d'espace de noms est un concept du langage.

Vous devez fournir une référence d'assembly au compilateur car il doit savoir où se trouve le code de bibliothèque que vous utilisez. Mais la directive using est purement facultative. Ces deux compileront bien:

Exemple 1:

System.Console.WriteLine("Without a using directive"); 

Exemple 2:

using System; 
//... 
Console.WriteLine("With a using directive"); 

La directive using ne sert qu'à vous éviter d'avoir à écrire des noms qualifiés dans tous les sens.

Questions connexes