C#4是否以先前C#版本没有的方式优化命名空间?
这个问题是为了感兴趣。 我正在使用第三方库,并在CMS.Security.Dummy
类中遇到以下文档:
不要删除这个类 – 这个类防止编译器在.NET 4.0下删除整个名称空间。
有人知道,或者有人可以推测,为什么.NET 4会删除名称空间,如果删除了虚拟类?
因为.NET 4是在源代码注释中明确命名的,所以我假设以前的C#版本显示不需要这个虚拟类的行为。 这纯粹是投机的。
屏幕截图
反编译的源代码
#region Assembly CMS.SettingsProvider.dll, v4.0.30319 // ...\solution\wwwroot\Bin\CMS.SettingsProvider.dll #endregion using System; namespace CMS.Security { // Summary: // DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping // entire namespace under .NET 4.0. public class Dummy { // Summary: // DO NOT DELETE THIS CLASS - This class prevents the compiler from dropping // entire namespace under .NET 4.0. public Dummy(); } }
一个值得赞赏的事实是,从底层CLRtypes系统的angular度来看,不存在“命名空间”这样的事情。 相反,这仅仅是一个约定 ,我们说一个包含句号的types是“名字空间的成员”。 从逻辑上说,法律之间没有任何区别:
namespace N { class C {} }
和伪代码:
class NC {}
C#迫使你假装这个愉快的小说是现实的,但它只是一个虚构 – 当然,从CLRtypes系统的angular度来看 。 从C#编译器的angular度来看,当然命名空间是“真实的”。 他们只是不符合元数据中除了部分types名称之外的任何内容。
简而言之:如果用“空”名称空间进行程序集编译,那么“名称空间”在编译的二进制文件中根本就不存在。 一个“命名空间”只有在库中有一个名称中有句点的types时才会出现。
现在,为什么你会关心确保一个“空”的名字空间有二进制forms存在,我不知道。
我假定以前的C#版本显示不需要这个虚拟类的行为
不。 自1.0以来,C#的每个版本都抛出空的命名空间。
鉴于命名空间不包含任何成员(没有这个类),我不确定甚至有一个名称空间的概念在这一点上…我也不期望它是有用的无论如何。
我只是试图用C#2编译器重现这一点,并且我看不到任何在IL中的空名称空间的踪迹。
我能想到的唯一半相关的问题是,在msbuild中编译项目时,间接引用并不总是复制到当前应用程序的bin目录中。 如果库B仅间接引用库A和库C引用B,则在编译库C时,库A的输出不一定会被复制到bin文件夹中。过去,我在类上使用了空字段引用,以确保依赖性是显式的,输出是正确部署的。 也许最初的开发者经历了类似的事情,这是他们的解决scheme?