Visual Studio C #: почему для некоторых библиотек недостаточно директивы using? - PullRequest
1 голос
/ 14 апреля 2010

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

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

Ответы [ 9 ]

26 голосов
/ 14 апреля 2010

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

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

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

9 голосов
/ 14 апреля 2010

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

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

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

7 голосов
/ 14 апреля 2010

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

2 голосов
/ 14 апреля 2010

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

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

2 голосов
/ 14 апреля 2010

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

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

2 голосов
/ 14 апреля 2010

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

2 голосов
/ 14 апреля 2010

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

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

1 голос
/ 14 апреля 2010

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

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

1 голос
/ 14 апреля 2010

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

...