很多大伙伴們常常會苦思一個問題:項目代碼中用不到的引用,是不是應該刪除,以避免代碼在編譯后存在太多的無意義引用?
其實,這個問題,你完全可以自己去應證的,咋應證呢?知道反射嗎,對了,只要你知道這玩意兒,那事情就好 do 了。
我建了一個控制台應用項目,然后,如下圖,我在【引用】節點下添加這么一堆引用。
然后,我寫了這段代碼:
XElement x = new XElement("car", new XElement("color", "Red"), new XElement("speed", 160)); Console.WriteLine(x);
也就是說,在我的代碼里面,只用到了 System.Xml.Linq 程序集中的類型(默認的 mscorlib 除外)。那么,當我這個程序集執行時,它會不會如VS項目中所列,把所有的引用都添到引用列表中呢?
好,咱們來反射一下:
Assembly curass = Assembly.GetExecutingAssembly(); var refs = curass.GetReferencedAssemblies(); Console.WriteLine("\n引用的程序集列表:"); foreach (AssemblyName asn in refs) { Console.WriteLine(asn.FullName); }
現在可以運行一下程序。
從上圖可以看到,在運行階段,只是引用了我在代碼中用到的 System.Xml.Linq 程序集。
我們還可以繼續實驗,在上面的代碼上再加上這么一句:
DataSet ds = new DataSet();
這個時候,我這代碼里不僅用到了 System.Xml.Linq 程序集,還用到了 System.Data 程序集。
再運行一下看看。
看到了吧,多了個 System.Data。
經過以上代碼的試驗,我們可以知道,在 VS 中為項目添加的程序集引用,並不會完全搬到運行的程序集中的,程序集的引用是看你在代碼中用到了哪些類型。
這么一來,大家就沒有必要在項目的引用列表中死摳門了,人啊,尤其是程序員,特別容易得強迫症,比如,時下流行的性能強迫症,實際上,性能只是個指標,可是很多人是本末倒置,把性能優化當作項目的核心,而項目的真正核心是主體功能開發。
這種思維,用一個很民間的詞來形容,叫做——鑽牛角尖,牛角尖有時候是得鑽一鑽,然而,過猶不及,牛角尖鑽得過了頭,反而誤事,弄得主次不分,是非不明了。凡事,不必太過。
那是不是 VS 項目中添加的引用都不必刪呢,老周是這么想的,如果是.net中的類庫,可以不那么在乎;不過,如果你引用的庫是來自第X方,當不使用時,應該去掉,因為別人的庫一般以.dll文件存儲,許多時候我們也不會把它安裝到GAC中的(不要什么都放到GAC中,這樣很浪費資源),一旦這些dll文件被刪了,有可能找不到文件,所以,對於第X方的引用應當在不用時去掉引用。
另外,補充一點,VS 在項目屬性窗口中,有一個【引用路徑】標簽頁。如下圖
這個是干啥用的呢。這個頁面中,你可以指定一堆目錄路徑,VS 的【引用】節點中的引用程序集可以自動到這些目錄中查找。注意,這些路徑只用於開發階段,對於編譯后的程序集無效。
好了,今天的文章沒什么技術含量,只是說一個小知識而已。