【问题标题】:Specialize a generic variable特化一个泛型变量
【发布时间】:2010-07-25 08:30:55
【问题描述】:

我有一个通用方法,我想为Strings 做一些特别的事情。

我发现DirectCast(DirectCast(value, Object), String) 获得String 值(当我已经确认GetType(T) Is GetType(String) 时)和DirectCast(DirectCast(newvalue, Object), T) 如许多类似问题的答案中所述有效。

但是还有什么更优雅的吗?它是高性能的吗?

【问题讨论】:

    标签: vb.net generics casting specialization


    【解决方案1】:

    在这种特殊情况下,有一个更简单的选择:在值上调用 ToString()。对于字符串,这将只返回原始引用。

    在一般情况下,您确实需要向上转换为对象并再次向下转换,不幸的是这很丑陋。在性能方面,我会很惊讶地发现这仍然是瓶颈 - 但我怀疑ToString() 调用与其他任何调用一样有效。

    【讨论】:

    • 当我真的只关心重新回到 T 时,这就是我提供一般性问题的结果:-)
    【解决方案2】:

    我现在实际上已经使用 Reflector 分析了代码(但实际上只关心 ILDASM 输出的等效项——事实上,C# 和 VB.NET 渲染器不会在任一方向显示转换为对象):

    DirectCast(DirectCast(value, Object), String)被编译成

     box !!T
     castclass string
    

    但是DirectCast(DirectCast(newvalue, Object), T)被编译成

     unbox.any !!T
    

    所以我对此感到满意(因为我真的只关心重新选回 T,正如我在对 Jon Skeet 的回答的评论中所说的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多