Какая разница между использованием оператора и добавлением ссылки?

В 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

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