很多大伙伴们常常会苦思一个问题:项目代码中用不到的引用,是不是应该删除,以避免代码在编译后存在太多的无意义引用?
其实,这个问题,你完全可以自己去应证的,咋应证呢?知道反射吗,对了,只要你知道这玩意儿,那事情就好 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 的【引用】节点中的引用程序集可以自动到这些目录中查找。注意,这些路径只用于开发阶段,对于编译后的程序集无效。
好了,今天的文章没什么技术含量,只是说一个小知识而已。