使用语句和添加引用有什么区别?

时间:2011-05-31 19:26:13

标签: c# visual-studio

在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,文化=中立,   公钥= b77a5c561934e089' 。

如果必须添加对我不是using的内容的引用,我怎么能事先知道呢?

7 个答案:

答案 0 :(得分:14)

引用告诉编译器在哪里查找要导入的类型。 使用语句告诉编译器在哪里寻找“全名”

所以你可以输入

 using System.Text

 StringBuilder sb; 
 // ...

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

但不管怎样,你必须有一个对System.dll的引用(或者是StringBuilder的mscorlib?)。如果没有引用,编译器就不知道可用的类型。

答案 1 :(得分:7)

您必须添加对类所在的程序集的引用,以及包含

的所有依赖项
  • 从其他程序集返回类型(即方法返回DbCommand
  • 基类或来自其他程序集的接口(即,类派生自DbCommand或实现接口)

答案 2 :(得分:2)

using表示您直接引用哪个命名空间。通常情况下,您需要包含 程序集引用的其他引用。

唯一的方法是像你一样做并在出现错误时修复它们,或者查看文档以查看是否列出了程序集所依赖的内容。

我不担心未使用的引用。如果它们未被使用,那么它们就不包括在内。

答案 3 :(得分:2)

我认为在这种情况下的答案是代码使用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的引用的原因

答案 4 :(得分:1)

有时,您添加的引用依赖于另一个库,因此您必须在引用中包含该库。

答案 5 :(得分:1)

添加引用允许用户使用该DLL中包含的任何对象或功能。

添加引用后,您可以使用该功能。

using子句有助于缩短代码:您可以节省输入。

例如:

使用System.IO;

然后我可以写

目录d = [代码在这里]

如果我有参考但没有使用,那么我会写

System.IO.Directory d = [Code goes here]

但您需要引用才能定义using语句或使用DLL中的该功能。

现在,如果您添加对代码的引用,并且该引用需要另一个DLL,那么在编译时,您将收到有关缺少引用的错误。在设计时它也标记出来。某些DLL是独立的(不需要其他引用),而其他DLL则需要多个引用,具体取决于您使用的功能。

答案 6 :(得分:1)

1)为了从外部程序集中访问类型,您必须在项目中必须添加引用。此参考告诉编译器项目中要包含哪些程序集。

2)但是,导入可选。 (在C#中,这是通过“ using ...”指令完成的)。这告诉编译器在哪里可以找到所使用的类型。如果未包括该名称,则每当您从该程序集中引用该类型时,都需要完全限定其名称空间及其名称。

示例: 要在控制台程序中使用 MessageBox 类( Show()方法),您必须添加引用到System.Windows.Forms程序集,然后将其引用为...
如果不导入程序集:
System.Windows.Forms.MessageBox.Show(“ Hello”);
如果要导入程序集:
MessageBox.Show(“ Hello”);