В чем разница между использованием оператора и добавлением ссылки? - PullRequest
17 голосов
/ 31 мая 2011

В 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?

Ответы [ 7 ]

14 голосов
/ 31 мая 2011

Ссылки указывают компилятору, где искать типы для импорта.Используя операторы, сообщаем компилятору, где искать «полные имена»

Таким образом, вы можете набрать

 using System.Text

 StringBuilder sb; 
 // ...

или

 System.Text.StringBuider sb;
 // ...

Но в любом случае вы должны иметьссылка на System.dll (или это mscorlib для StringBuilder?).Без ссылки компилятор не знает, какие типы доступны.

7 голосов
/ 31 мая 2011

Необходимо добавить ссылку на сборку, в которой находится класс, и любые зависимости, которые включают

  • типы возврата из другой сборки (т. Е. Метод возвращает DbCommand)
  • базовый класс или интерфейс из другой сборки (т. Е. Класс является производным от DbCommand или реализует интерфейс)
2 голосов
/ 01 июня 2011

Я думаю, что ответ в этом случае заключается в том, что код использует объект из пространства имен System.data. В вашем примере команда var является DBCommand. Это ссылка System.Data, а не System или Microsoft.Practices.EnterpriseLibary.Data. Похоже, что этот код также нуждается в справочнике команд. Что возвращает GetSqlStringCommand? System.Data.DBCommand. Посмотрите на эту ссылку. [ссылка] http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.data.database.getsqlstringcommand(v=pandp.31).aspx Именно поэтому вам нужна ссылка на System.Data.

2 голосов
/ 31 мая 2011

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

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

Я бы не стал беспокоиться о неиспользованных ссылках. Если они не используются, то они не включены.

1 голос
/ 26 сентября 2018

1) Чтобы получить доступ к типу из внешней сборки, вы ДОЛЖНЫ ДОБАВИТЬ ССЫЛКУ в свой проект. Эта ссылка сообщает компилятору, какую сборку (-ы) включить в ваш проект.

2) Импорт сборки, однако, необязательно . (в C # это делается с помощью директивы using ...). Это сообщает компилятору, где искать используемый тип. Если он не включен, тогда, когда вы ссылаетесь на тип из этой сборки, вам необходимо полностью определить его пространство имен вместе с его именем.

ПРИМЕР: для использования MessageBox class ( Show () метод) в консольной программе, которую ВЫ ДОЛЖНЫ добавить в Систему. Затем сборка Windows.Forms ссылается на ...
Если сборка не импортируется:
System.Windows.Forms.MessageBox.Show ( "Hello");
При импорте сборки:
MessageBox.Show ( "Hello");

1 голос
/ 31 мая 2011

Добавление ссылки позволяет использовать любые объекты или функции, содержащиеся в этой DLL.

После добавления ссылки вы можете использовать эту функцию.

Предложение using помогает сократитькод: Вы можете сэкономить при наборе.

Например:

с использованием System.IO;

Затем я могу написать

Каталог d = [Код идетздесь]

Если бы у меня была ссылка, а у меня не было использования, то я бы написал

System.IO.Directory d = [Код идет сюда]

Новам нужна ссылка, чтобы определить оператор using или использовать эту функциональность из DLL.

Теперь, если вы добавите ссылку на ваш код, а для этой ссылки потребуется другая DLL, то при компиляции вы получитеошибка об отсутствующей ссылке.Во время разработки это также отмечено.Некоторые библиотеки DLL автономны (не требуют других ссылок), в то время как другие требуют нескольких ссылок в зависимости от того, какие функции или функции вы используете.

1 голос
/ 31 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...