Visual Studio C #: почему директивы using недостаточно для некоторых библиотек?

Сценарий: мне нужно было добавить HttpUtility в мой проект, и я начал с добавления слова using System.Web в свою коллекцию директив using. Однако класс HttpUtility по-прежнему не разрешается, и я обнаружил (через этот вопрос), что мне нужно было добавить ссылку на мой проект.

Вопрос: Зачем мне нужно добавлять ссылку на эту библиотеку, если для большинства других классов будет достаточно директивы using?


person JYelton    schedule 14.04.2010    source источник


Ответы (9)


Вопрос: Почему мне нужно добавлять ссылку на эту библиотеку, если для большинства других классов будет достаточно оператора using?

using никогда недостаточно, вам всегда нужно добавить ссылку на соответствующую DLL, содержащую класс.

Но в вашем проекте по умолчанию есть ссылки на некоторые библиотеки, и это наиболее важно mscorlib.dll. Судя по всему, все классы, которые вы использовали до сих пор, были в этой библиотеке.

person Konrad Rudolph    schedule 14.04.2010
comment
Я должен отметить, что я добавил несколько сторонних классов, на которые я ссылался, а затем добавил операторы using ранее. У меня каким-то образом был психический блок, когда я пошел использовать HttpUtility и предположил, что он уже будет доступен, или что использование одного как-то разрешит его. - person JYelton; 14.04.2010

Потому что Visual Studio добавляет ссылки на ряд распространенных dll при создании нового проекта.

РЕДАКТИРОВАТЬ: Чтобы уточнить, здесь есть две проблемы - пространства имен и сборки. Пространства имен представляют собой логическую иерархию классов, а сборки являются физическими «контейнерами» коллекции классов. Сборка может содержать несколько пространств имен, а пространство имен может быть распределено по нескольким сборкам (хотя это довольно редко). Директива using означает, что вам не нужно полностью указывать имя типа, например. вы можете объявить List<T>, а не System.Collections.Generic.List<T>.

Visual studio добавляет ссылки на различные сборки при создании нового проекта, который содержит ряд часто используемых пространств имен, таких как System. Если вы добавите директиву using для пространства имен, содержащегося в этих сборках, она будет работать, однако, если вам нужно использовать пространство имен, содержащееся в другой сборке, такой как System.Web, тогда вам нужно будет добавить ссылку, прежде чем пространство имен может быть решено.

person Lee    schedule 14.04.2010
comment
Итак, в новом проекте будет несколько часто используемых классов, а для любых других потребуется добавить ссылку, прежде чем оператор using станет полезным? - person JYelton; 14.04.2010
comment
@JYelton Правильно. Здесь есть две концепции: пространства имен и сборки. Сборка содержит класс, и этот класс помечен пространством имен. Добавление ссылки на сборку, некоторые из которых уже добавлены по умолчанию, дает вам доступ к классу, например System.IO.TextWriter. Но вы должны полностью указать имя с пространством имен как System.IO.TextWriter. Чтобы сократить это, вы затем добавляете оператор using. Так что на самом деле оператор using не более чем избавляет вас от необходимости вводить System.IO каждый раз, когда вы хотите использовать класс в этом пространстве имен. - person AaronLS; 14.04.2010
comment
@JYelton - в нем будет несколько часто используемых dll (сборок). Каждая dll может содержать множество классов. - person Marc Gravell; 14.04.2010
comment
@JYelton - Да - если вы создадите новый проект в VS и развернете узел «ссылки» в обозревателе решений, вы увидите, что на ряд сборок уже есть ссылки. Директивы using, которые вы использовали до сих пор, ссылаются на пространства имен, которые существуют в этих сборках, но System.Web этого не делает, поэтому вам нужно добавить ссылку на соответствующие библиотеки DLL. - person Lee; 14.04.2010
comment
Спасибо всем, я какое-то время использую VS и, по-видимому, на большинство классов, которые мне нужны, уже были ссылки. Вы можете сказать, что я еще новичок! - person JYelton; 14.04.2010

Директива using предназначена просто для упрощения синтаксиса. То есть, вместо того, чтобы писать System.Web.HttpUtility, вы можете поместить using System.Web; в верхней части модуля и просто написать HttpUtility.MethodName. Однако ссылка на библиотеку - это то, что на самом деле позволяет вам вызывать классы и методы в этой библиотеке.

person Thomas    schedule 14.04.2010

Потому что некоторые пространства имен распределены по сборкам.

Сборки для наиболее часто используемых пространств имен в .NET автоматически добавляются в ваш проект, но если в вашем проекте еще нет ссылки на сборку, вам необходимо добавить ссылку на сборку.

person Justin Niessner    schedule 14.04.2010

Любой тип, который вы используете в своем приложении, находится в некотором пространстве имен, которое находится в некоторой сборке. Оператор using позволяет использовать только типы без указания пространства имен, которому он принадлежит. Если вы не добавили в проект ссылку на сборку, вы не можете использовать его типы. Причина, по которой вы можете использовать using с некоторыми пространствами имен, заключается в том, что ссылки на несколько сборок включены в каждый проект по умолчанию.

person Andrew Bezzub    schedule 14.04.2010

оператор using - это просто ярлык для устранения необходимости определять полное пространство имен в коде, вам нужно добавить ссылку на библиотеку, которая фактически включает класс, который вы хотите создать.

пространства имен распределены по многим библиотекам

person Pharabus    schedule 14.04.2010

using System.Web - это директива использования, а не инструкция using. Но вам нужно добавить ссылку, потому что System.Web.dll не является одной из стандартных dll, включенных в проект winform / wpf и т. Д. Отчасти потому, что маловероятно, что он вам понадобится, а отчасти потому, что он не поддерживается в «профиле клиента».

На самом деле это просто проблема управления библиотекой; CLR огромна; он не предполагает, что вы хотите всего.

person Marc Gravell    schedule 14.04.2010
comment
И это хорошо, я бы не хотел, чтобы массивная библиотека была включена в какую-нибудь небольшую служебную программу. В этом есть смысл, спасибо! - person JYelton; 14.04.2010

Проще говоря, «использование» помогает компилятору понять, что нужно сделать, прежде чем он сможет скомпилировать ваш файл. Как только известно, что нужно вытащить, его нужно найти, чтобы его можно было втянуть. Вот почему ссылка имеет значение.

person psychotik    schedule 14.04.2010

Reference означает, что вы добавляете библиотеку как зависимость к вашему проекту. System.Web - это собственный DLL-файл.

Using означает, что вы локально импортируете пространство имен или класс из своих ссылок.

person Bobby    schedule 14.04.2010