Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';使用语句和添加引用之间的区别是什么?_C#_Visual Studio - Fatal编程技术网

C# 什么';使用语句和添加引用之间的区别是什么?

C# 什么';使用语句和添加引用之间的区别是什么?,c#,visual-studio,C#,Visual Studio,在VisualStudio中,何时必须添加对dll的引用?我总是尽量在我的项目中有最少的参考资料,我尽量只包括那些真正必要的参考资料 如果我的源代码中有using语句,我会认为我只需要一个引用。但这并不总是足够的 例如,我有一个非常简单的程序,使用系统和Microsoft.Practices.EnterpriseLibrary.Data: using System; using Microsoft.Practices.EnterpriseLibrary.Data; public class S

在VisualStudio中,何时必须添加对dll的引用?我总是尽量在我的项目中有最少的参考资料,我尽量只包括那些真正必要的参考资料

如果我的源代码中有
using
语句,我会认为我只需要一个引用。但这并不总是足够的

例如,我有一个非常简单的程序,
使用
系统和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));
            }
        }
    }
}
我想我只需要参考系统和Microsoft.Practices.EnterpriseLibrary.Data。但事实并非如此。如果我不引用System.Data,代码将无法编译

类型 “System.Data.Common.DbCommand”是 在未定义的程序集中定义 参考。您必须添加一个引用 到程序集的System.Data, 版本=2.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089'


我如何事先知道何时必须添加对我未使用的东西的引用?引用告诉编译器在哪里查找要导入的类型。 使用语句告诉编译器在哪里查找“全名”

所以你可以选择任何一种

 using System.Text

 StringBuilder sb; 
 // ...


但无论哪种方式,您都必须有对System.dll的引用(或者它是StringBuilder的mscorlib?)。如果没有ref,编译器不知道可用的类型。

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

您必须添加对类所在的程序集的引用,以及任何依赖项,包括

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

使用的
指示您直接引用的命名空间。通常情况下,您需要包含该程序集引用的其他引用

唯一的方法是按照您所做的去做并在错误发生时修复它们,或者检查文档以查看是否列出了程序集所依赖的内容


我不会担心未使用的参考资料。如果未使用它们,则不包括它们。

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

添加引用后,即可使用该功能

using子句有助于缩短代码:您可以在键入时进行保存

例如:

使用System.IO

然后我就可以写了

目录d=[代码在这里]

如果我有参考资料,但没有使用说明,那么我会写

System.IO.Directory d=[代码在这里]

但是您需要引用来定义using语句或从DLL使用该功能


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

我认为这种情况下的答案是代码使用的是System.data命名空间中的对象。在您的示例中,var命令是DBCommand。它是一个System.Data参考,而不是System或Microsoft.Practices.EnterpriseLibrary.Data。因此,代码似乎也需要一个命令引用。GetSqlStringCommand返回什么?一个System.Data.dbc命令。看看这个链接。[连结]http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.data.database.getsqlstringcommand(v=pandp.31).aspx这就是为什么您需要对System.Data的引用。

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

2) 但是,导入程序集是可选的。(在C#中,这是通过“使用…”指令完成的)。这告诉编译器在何处查找所使用的类型。如果未包含该名称,则无论何时引用该程序集中的类型,都需要完全限定其名称空间及其名称。

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

MessageBox.Show(“你好”)

这不是问题所在,我不这么认为。他在问为什么“使用system.text”不足以让编译器找到类型。不,这是关于除了您实际使用的程序集之外,还需要引用程序集。好的,这就是为什么理解“使用”的作用可以回答这个问题。如果这些类型又依赖于其他类型,那么您需要引用它们。using语句与查找类型无关。我将您的答案标记为正确答案,因为您还列出了一些示例。我知道我必须引用我使用的DLL功能。问题是为什么有时我不得不添加对我不知道自己正在使用的dll的引用;您可以向Visual Studio项目添加任意多的程序集引用,而不会出现任何问题。我是否应该担心使用
语句会产生不必要的
?它们是否会导致引用的dll被包含,即使它们根本不需要?@comecme-否。编译器和链接器应该忽略它们。或者,右键单击using语句并选择“删除未使用的语句”选项。
 System.Text.StringBuider sb;
 // ...