2011-05-31 79 views
15

在Visual Studio中,您何時需要添加對dll的引用?我總是試着在我的項目中引用最少的參考資料,我試圖只包含那些非常必要的參考資料。使用語句和添加引用有什麼區別?

我想我只需要一個參考,如果我有一個using聲明在我的來源。但這並不總是足夠的。

舉例來說,我有一個非常簡單的程序,它是using系統和Mi​​crosoft.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)); 
      } 
     } 
    } 
} 

認爲我只需要參考系統和Mi​​crosoft.Practices.EnterpriseLibrary 。數據。但事實並非如此。如果我沒有引用System.Data,代碼將不會編譯。

類型 「System.Data.Common.DbCommand」在未 引用的程序集定義 。您必須爲程序集「System.Data, Version = 2.0.0.0,Culture = neutral, PublicKeyToken = b77a5c561934e089'添加參考 。

我怎麼能預先知道什麼時候我必須添加一個引用我不是using

+1

請注意,C#編譯器僅將實際使用的彙編引用包含到編譯程序集中;您可以隨意添加儘可能多的程序集引用到您的Visual Studio項目中。 – dtb 2011-05-31 20:07:00

回答

5

你必須的引用添加到所述類駐留在組件和任何相關性,其包括來自其他組件

  • 返回類型(即一個方法返回DbCommand
  • 基類或從其它組件接口(即一類從DbCommand派生或實現一個接口)
+0

我將你的答案標記爲正確的答案,因爲你也列舉了一些例子。 – comecme 2011-05-31 19:54:05

12

引用告訴編譯器在哪裏查找要導入的類型。 using語句告訴編譯器到哪裏尋找「全名」

所以,你可以鍵入

using System.Text 

StringBuilder sb; 
// ... 

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

但無論哪種方式,你必須有系統的參考。 DLL(或者是StringBuilder的mscorlib?)。沒有ref,編譯器不知道可用的類型。

+0

這不是問題所在。 – Femaref 2011-05-31 19:30:13

+0

我不這麼認爲。他在問爲什麼'使用system.text'不足以使編譯器找到類型。 – 2011-05-31 19:31:47

+1

不,它是關於除了你實際使用的組件之外還需要引用組件。 – Femaref 2011-05-31 19:33:20

0

有時您添加的引用對另一個庫有依賴性,因此您必須在引用中包含該庫。

2

using表示你是哪個名稱空間直接引用。通常情況下,您需要包含程序集引用的其他參考。

唯一的辦法是或者像你一樣做並且在錯誤發生時修復錯誤,或者檢查文檔以查看是否列出了組件依賴的內容。

我不擔心未使用的引用。如果他們沒有使用,那麼他們不包括在內。

+0

*應該*我擔心不必要的'使用'語句?畢竟,它們是否會引入引用的dll,即使它們不是必需的? – comecme 2011-06-05 13:56:39

+1

@comecme - no。它們應該被編譯器和鏈接器忽略。或者,右鍵單擊using語句並選擇「刪除未使用的語句」選項。 – ChrisF 2011-06-05 13:58:42

1

添加引用允許使用該DLL中包含的任何對象或功能。

一旦添加了引用,就可以使用該功能。

使用條款有助於縮短代碼:您可以節省打字時間。

例如:

using System.IO;

然後我就可以寫

目錄d = [代碼放在這裏]

如果我有參考和使用沒有,那麼我會寫

System.IO.Directory d = [代碼在這裏]

但是,您需要引用來定義使用語句或從DLL中使用該功能。

現在,如果您添加對代碼的引用並且該引用需要另一個DLL,那麼當您編譯時會收到有關缺少引用的錯誤。在設計時它也被標記。某些DLL是獨立的(不需要其他引用),而其他DLL則需要多個引用,具體取決於您正在使用的功能或功能。

+0

我明白我必須引用DLL我使用的功能。問題是爲什麼我有時必須添加對dll的引用,我不知道我正在使用。 – comecme 2011-05-31 19:55:44

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的引用。

相關問題