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

其实,这个问题,你完全可以自己去应证的,咋应证呢?知道反射吗,对了,只要你知道这玩意儿,那事情就好 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. OPENCV之GFTT特征点检测

    之前角点检测的时候提到过角点检测的算法,第一个是cornerHarris计算角点,但是这种角点检测算法容易出现聚簇现象以及角点信息有丢失和位置偏移现象,所以后面又提出一种名为 shi_tomasi的角 ...

  2. laravel定时任务

    原文链接:https://github.com/liebig/cron 感觉Cron只是帮你将很多需要定时执行的任务都归结在一个方法中,并且各自设定不同的时间,比较统一方便,但是在外部还是需要操作li ...

  3. Effective java -- 3 类和接口

    第十三条:使类和成员的可访问性最小化 一个设计良好的模块会将实现细节隐藏起来,只将暴露API.模块之间调用并不知道对象的细节.这个概念成为信息隐藏或封装.要注意一点,设计的一个方法或者其他什么,只要不 ...

  4. c++读取REG_MULTI_SZ类型注册表

    First: run RegQueryValueEx to get type and necessary memory size: Single byte code: DWORD type, size ...

  5. iOS开发——导入第三方库引起的unknown type name 'NSString'

    今天加入SVProgressHUD的第三方库的时候报了24个错误( too many errors emitted, stopping now),都是 expected identifier or ' ...

  6. javascript--study

    1.函数传参:按值传递 对于数字.字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量. 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组 ...

  7. C# new和override的区别

    浅析C# new和override的区别 C#中new和override是继承中经常用到的两个关键字,但是往往有时候容易把这两个关键字的作用搞混淆. new C# new关键字表示隐藏,是指加上new ...

  8. UILable添加事件

    原文:http://blog.sina.com.cn/s/blog_9e8867eb0101dk6t.html 先需要声明的是:UILabel或UIImageView的 userInteraction ...

  9. Centos5.5系统备份

    使用root用户切换到根目录 然后,使用下面的命令备份完整的系统: tar cvpzf backup.tgz / --exclude=/proc --exclude=/lost+found --exc ...

  10. XML 特殊字符处理和 CDATA

    在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆. 所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA ...