很多大伙伴们常常会苦思一个问题:项目代码中用不到的引用,是不是应该删除,以避免代码在编译后存在太多的无意义引用?

其实,这个问题,你完全可以自己去应证的,咋应证呢?知道反射吗,对了,只要你知道这玩意儿,那事情就好 do 了。

我建了一个控制台应用项目,然后,如下图,我在【引用】节点下添加这么一堆引用。

然后,我写了这段代码:

            XElement x = new XElement("car",
new XElement("color", "Red"),
new XElement("speed", ));
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 的【引用】节点中的引用程序集可以自动到这些目录中查找。注意,这些路径只用于开发阶段,对于编译后的程序集无效。

好了,今天的文章没什么技术含量,只是说一个小知识而已。

【.net 深呼吸】项目中是否有必要删去多余的引用的更多相关文章

  1. AE创建组件失败,项目中已存在对esri.arcgis.***的引用

    AE创建组件失败,项目中已存在对esri.arcgis.***的引用 解决办法:在解决方案资源管理器的引用中把错误提示中的引用删掉,再创建组件就没问题了.

  2. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  3. 【MediaKit】WPF项目中 调用摄像头拍照的开发包

    今天遇到一个 人事的项目,项目中需要调用摄像头给员工照相.如何解决这个问题呢? 介绍一个开发包给你,MediaKit.论坛里头的人都说好,但是黑兔觉得大家好才是真的好.你不妨试试~ 第一步:添加WPF ...

  4. Windows Presentation Foundation (WPF) 项目中不支持xxx的解决

    一般Windows Presentation Foundation (WPF) 项目中不支持xxx都是由于没引用相应的程序集导致,比如Windows Presentation Foundation ( ...

  5. class类名在webpack项目中的两种引用方式

    一.问题描述 在项目工程中,我们通常既用到css module,也用到普通的less文件引用方式,代码及webpack配置如下,运行时,发现只有css module起作用,如何让两者都起作用呢? // ...

  6. 关于QT建立项目中遇到的相关问题的处理办法

    关于QT建立项目中遇到的相关问题的处理办法 1.在QTCreater中新建一个空的工程时,第一次运行会抱一个错误,如下: -1: error: LNK1123: 转换到 COFF 期间失败: 文件无效 ...

  7. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  8. ABP项目中使用Swagger生成动态WebAPI

    本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...

  9. iOS 之项目中遇到的问题总结

    昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...

随机推荐

  1. 16、手把手教你Extjs5(十六)Grid金额字段单位MVVM方式的选择

    这一节来完成Grid中的金额字段的金额单位的转换.转换旰使用MVVM特性,总体上和控制菜单的几种模式类似.首先在目录app/view/main/menu下建立文件Monetary.js,用于放金额单位 ...

  2. GCJ Round 1C 2009 Problem C. Bribe the Prisoners

    区间DP.dp[i][j]表示第i到第j个全部释放最小费用. #include<cstdio> #include<cstring> #include<cmath> ...

  3. STM32_IAP详解(有代码,有上位机)

    Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片 ...

  4. IAR for STM8 错误

    一个IAR for STM8 v1.3 的工程,换到1.4版后出现如下错误 unable to allocate space for sections/blocks with a total esti ...

  5. js数组之迭代方法

      ES5为数组对象定义了5个迭代方法(即递归,简单的说就是自己可以调用自己). 每个方法接收两个参数:要在每一项上运行的函数(接收3个参数:数组项的值,该项在数组中的位置,数组对象本身)和(可选的) ...

  6. ps--记录几个方法步骤

    1.图片文字去掉 1.1 矩形工具-->吸管-->alt+delete 1.2 钢笔工具-->Ctrl+回车(变换选区)-->吸管-->alt+delete 2.图层锁不 ...

  7. Linq左关联 右关联 内关联

    1.左连接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals ...

  8. UVa 10341 - Solve It

    题目:给一个方程,求解方程的解.已给出解的范围,并且可知方程等号左侧的函数是递减的,可用二分法进行试探,直到得出给定误差范围内的解. #include <cstdio> #include ...

  9. "SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名"转

     "SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名" 2014-06-12 12:01:10 最近在学习SQL SERVER的高级复制技术的时候 ...

  10. 新手如何学习java(java学习建议路线图)

    怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:     首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA). ...