Какая разница между использованием оператора и добавлением ссылки?
В Visual Studio, когда вам нужно добавить ссылку на DLL? Я всегда стараюсь иметь минимальные ссылки в моих проектах, я стараюсь включать только те, которые действительно необходимы.
Я бы подумал, что мне нужна ссылка только в том случае, если у меня есть оператор using
в моем источнике. Но это не всегда достаточно.
Например, у меня есть очень простая программа, которая using
System и Microsoft.Practices.EnterpriseLibrary.Data:
using System;
using Microsoft.Practices.EnterpriseLibrary.Data;
public class SimpleConnection {
private static void Main() {
var database = DatabaseFactory.CreateDatabase();
var command =
database.GetSqlStringCommand(
"select table_name from information_schema.tables");
using (var reader = database.ExecuteReader(command)) {
while (reader.Read()) {
Console.WriteLine(reader.GetString(0));
}
}
}
}
Я бы подумал, что мне нужно только ссылаться на System и Microsoft.Practices.EnterpriseLibrary.Data. Но это не так. Если я не ссылаюсь на System.Data, код не будет компилироваться.
Тип "System.Data.Common.DbCommand" - определенных в сборке, которая не является ссылки. Вы должны добавить ссылку к сборке 'System.Data, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089'.
Как я могу узнать заранее, когда мне нужно добавить ссылку на то, что я не using
?
Ответы
Ответ 1
Вам нужно добавить ссылку на сборку, в которой находится класс, и любые зависимости, которые включают
- возвращать типы из другой сборки (т.е. метод возвращает
DbCommand
)
- базовый класс или интерфейс из другой сборки (т.е. класс происходит от
DbCommand
или реализует интерфейс)
Ответ 2
Ссылки говорят компилятору, где искать типы для импорта.
Использование операторов сообщает компилятору, где искать "полные имена"
Итак, вы можете либо напечатать
using System.Text
StringBuilder sb;
// ...
или
System.Text.StringBuider sb;
// ...
Но в любом случае у вас должна быть ссылка на System.dll(или это mscorlib для StringBuilder?). Без ref компилятор не знает, какие типы доступны.
Ответ 3
using
указывает, какое пространство имен вы непосредственно ссылаетесь. Часто бывает, что вам нужно включить другие ссылки, которые ссылаются на сборку.
Единственный способ - либо сделать так, как вы, и исправить ошибки по мере их возникновения, либо проверить документацию, чтобы увидеть, указывает ли это, на что зависит сборка.
Я не стал бы беспокоиться о неиспользуемых ссылках. Если они не используются, они не включены.
Ответ 4
Я думаю, что ответ в этом случае состоит в том, что код использует объект из пространства имен System.data. В вашем примере команда var - это DBCommand. Это ссылка на System.Data и не является Системой или Microsoft.Practices.EnterpriseLibary.Data. Таким образом, похоже, что этот код также нуждается в ссылке на команду. Что возвращает GetSqlStringCommand? A System.Data.DBCommand. Посмотрите на эту ссылку. [link] http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.data.database.getsqlstringcommand(v = pandp.31).aspx Вот почему вам нужна ссылка на System.Data.
Ответ 5
Добавление ссылки позволяет использовать любые объекты или функциональные возможности, содержащиеся в этой DLL.
После добавления ссылки вы можете использовать эту функциональность.
Предложение using помогает сократить код: вы можете сохранить при вводе.
Например:
с использованием System.IO;
Затем я могу написать
Каталог d = [Код идет здесь]
Если у меня была ссылка и у меня не было использования, я бы написал
System.IO.Directory d = [Код идет здесь]
Но вам нужна ссылка, чтобы определить оператор using или использовать эту функциональность из DLL.
Теперь, если вы добавите ссылку на свой код и эта ссылка нуждается в другой DLL, тогда при компиляции вы получите сообщение об ошибке. Во время разработки он также отмечен. Некоторые библиотеки DLL являются автономными (не требуют других ссылок), в то время как другие требуют нескольких ссылок в зависимости от того, какие функции или функции вы используете.
Ответ 6
Иногда добавляемые ссылки имеют зависимость от другой библиотеки, поэтому вы должны иметь эту библиотеку в своих ссылках.