【问题标题】:String.Intern() method missing in metro c#Metro c#中缺少String.Intern()方法
【发布时间】:2012-08-03 11:40:10
【问题描述】:

如何在 Metro c# 中获取字符串实习生方法。如果在 windows 8 c# 中找不到,是否有任何等效的方法来维护 系统对指定字符串的引用。

【问题讨论】:

  • 您使用的是最新版本的 Windows 8?据我了解,Metro 配置文件在每个版本预览之间存在显着差异。如果找不到,则必须实施自己的解决方案。您可能只需使用ref 和自定义方法(可能是扩展)就可以逃脱。描述您要解决的问题,很可能,您以错误的方式解决问题。
  • 我有兴趣将 lucene.net 移植到 MetroLucene;他们正在使用实习生作为字段名。

标签: c# windows-8 microsoft-metro


【解决方案1】:

这是 CLR 中内置的语言投影不可避免的副作用,它启用了“.NET for Metro 风格应用程序”api。该投影将从 WinRT api 调用获得的字符串映射到 System.String。底层字符串根本不是托管字符串,也不存在于垃圾收集堆上。它是an HSTRING. 语言投影使它表现得像一个 System.String

因此,在该 api 中,String 类没有非常特定于托管字符串的方法。像 Intern() 和 IsInterned() 一样,它只能用于托管字符串。 Copy、Clone 和 GetEnumerator 也一样。对此没有解决方法,对 mscorlib 中托管 String 类的访问完全被引用程序集阻止,它将类型转发到 System.Runtime.dll。如果没有这种方法,你必须让它工作。

【讨论】:

  • 我们删除字符串上的方法的原因不是因为 WinRT,而是因为我们选择了这个机会来删除我们一开始就后悔添加的方法,或者限制了我们的计划为未来而创新。
  • String.GetEnumerator 落入了“如果我们重新开始我们不会添加它”的桶中。在 .NET Framework 中,它返回 CharEnumerator,这对于迭代字符串非常低效(它会导致为每个循环分配),并且 C# 和 VB 的 foreach 代码自 1.0 天以来就没有使用过这种类型。 (他们现在将字符串上的 foreach 转换为使用字符串索引器的有效“for 循环”)。虽然有些删除似乎是任意的,但每次删除都是经过深思熟虑的选择,属于上述类别之一。
  • 有人检测到我也遇到的性能问题的例子:stackoverflow.com/questions/18259072/…
  • 这真是太糟糕了,因为在 F# 中,它是一个 Enumerable 使得使用字符串几乎可以容忍。 :'(
猜你喜欢
  • 1970-01-01
  • 2016-07-12
  • 2022-08-07
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多