CLR via C# System.String 类型 字符串留用

检查字符串相等性是应用程序的常见操作,也是一种可能严重损害性能的操作。

执行序号(ordinal)相等性检查时,CLR快速测试两个字符串是否包含相同数量的字符。答案否定,字符串肯定不相等;答案肯定,字符串则可能相等。然后,CLR必须比较每个单独字符才能最终确认。

而执行对语言文化敏感的比较时,CLR必须比较所有单独的字符,因为两个字符串即使长度不同也可能是相等。

此外,在内存中复制同一个字符串的多个实例纯属浪费,因为字符串时“不可变”的。在内存中只保留字符串的一个实例将明显提升内存的利用率。需要引用字符串的所有变量只需指向单独一个字符串对象。

如果应用程序经常对字符串进行区分大小写的序号比较,或者事先知道许多字符串对象都有相同的值,就可利用CLR的字符串留用(string interning)机制来显著提升性能。CLR初始化会创建一个内部哈希表。在这个表中,键(key)是字符串,而值(value)是对托管堆中的 String 对象的引用。哈希表最开始是空的。String 类提供了两个方法,便于你访问这个内部哈希表:

方法 Intern 获取一个 String ,获得它的哈希码,并在内部哈希表中检查是否有相匹配的。如果存在完全相同的字符串,就返回对现有 String 对象的引用。如果不存在完全相同的字符串,就创建字符串的副本,将副本添加到内部哈希表中,返回对该副本的引用。如果应用程序不再保持对原始 String 对象的引用,垃圾回收器就可释放那个字符串的内存。注意垃圾回收器不能释放内部哈希表引用的字符串,因为哈希表正在容纳对它们的引用。除非卸载 AppDomain 或进程终止,否则内部哈希表引用的 String 对象不能被释放。

IsInterned 方法也获取一个 String ,并在内部哈希表中查找它。如果哈希表中有匹配的字符串,IsInterned 就返回对这个留用(interned)字符串对象的引用。但如果没有,IsInterned 会返回 null ,不会将字符串添加到哈希表中。

程序集加载时,CLR默认留用程序集的元数据中描述的所有字面值(literal)字符串。Microsoft 知道可能因为额外的哈希表查找而显著影响性能,所有现在能禁用此功能。如果程序集用System.Runtime.CompilerServices.CompilationRelaxationsAttribute 进行了标记,并指定了 System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning 标志值,那么根据ECMA 规范,CLR 可能选择不留用那个程序集的元数据中定义的所有字符串。注意,为了提升应用程序性能,C#编译器在编译程序集时总是指定上述两个特性和标志。

即使程序集指定了这些特性和标志,CLR也可能选择对字符串进行留用,但不要依赖CLR的这个行为。事实上,除非显式调用 String 的 Intern 方法,否则永远都不要以“字符串已留用”为前提来写代码。

//--

总之,字符串留用虽然有用,但使用须谨慎。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: clr.via.c 是一种 Microsoft .NET 平台软件应用程序,它是一个命令行工具,可用于在 .NET 平台上编译和运行代码。clr.via.c 工具可以从 C#、F#、Visual Basic.NET、C++/CLI 和其他 .NET 语言编写的源代码文件生成可执行文件。通过 clr.via.c 工具,开发人员可以使用 .NET 平台功能和库,创建各种类型的应用程序,包括桌面应用程序、Web 应用程序、基于客户端的应用程序和服务端应用程序。 clr.via.c 工具使用的是本机代码编译器,它可以将源代码编译为执行速度更快的本机代码。与传统编译器不同,clr.via.c 工具编译的本机代码是与平台无关的,这意味着代码可以在任何支持 .NET 平台的操作系统上运行。 clr.via.c 工具也支持跨平台开发,如果使用 .NET Standard 库,应用程序可以在 .NET Core 和 .NET Framework 上运行,这使得开发人员可以跨多种操作系统和平台构建可扩展的应用程序。 总之,clr.via.c 工具是一个非常重要的开发工具,它为开发人员提供了跨平台和跨语言的应用程序开发的灵活性和可扩展性。它使得开发人员能够更快地构建高质量的应用程序,实现更快的开发和更好的性能。 ### 回答2: clr.via.c 是一个开源跨平台的 web 框架,它主要使用 C# 语言编写,并具有简单易用、高效、可扩展等特点。 clr.via.c 拥有强大的路由功能,可以方便地实现 URL 映射;同时支持多种模板引擎,开发者可以根据自己的需求选择合适的模板引擎来处理页面的渲染。 此外,clr.via.c 还支持扩展插件,可以快速实现一些常见的业务场景,比如文章分享、用户管理等。 clr.via.c 是用 c 语言写的一种跨平台语言。他以其高效的性能和开发者友好的特性而受到越来越多的开发者的欢迎。当我们需要快速开发一个简单的 Web 应用时,clr.via.c 是一个非常好的选择。 ### 回答3: clr.via.c是一种使用C语言编写的托管代码编写工具。它是Microsoft .NET Framework中的一部分,用于支持C语言编写基于.NET的Windows应用程序,包括Windows Forms、WPF、ASP.NET等。使用clr.via.c,开发人员可以使用C语言编写托管代码和原生代码,同时可以使用.NET Framework提供的强大功能,如垃圾回收、类型安全性、面向对象编程等。通过clr.via.c,C程序员可以像使用C#或VB.NET一样使用.NET框架和其生态系统,而无需学习新的编程语言。 clr.via.c的工作方式是将C源代码编译为本机代码,然后使用.NET运行时环境将其转换为托管代码。这个过程可以自动进行,也可以手动控制。在通过CLR访问.NET框架的时候,clr.via.c的性能比标准的.NET语言(如C#和VB.NET)略有差异,因为C语言是一种本机语言,而C#和VB.NET是一种完全托管的语言。 总的来说,clr.via.c为C程序员提供了一条通向.NET框架和其生态系统的道路,使他们可以使用.NET的强大功能来构建高效,安全和易于维护的应用程序。它将C语言编写的应用程序与.NET框架结合使用,使得这些应用程序能够在.NET平台上运行,并且可以利用.NET提供的各种工具和技术进行开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值