相关疑难解决方法(0)

C#的隐藏功能?

在我从这个问题中学到以下内容后,我想到了这一点:

where T : struct
Run Code Online (Sandbox Code Playgroud)

我们C#开发人员都知道C#的基础知识.我的意思是声明,条件,循环,运算符等.

我们中的一些人甚至掌握了Generics,匿名类型,lambdas,LINQ等......

但是C#粉丝,瘾君子,专家几乎都不知道C#最隐藏的功能或技巧是什么?

以下是到目前为止显示的功能:


关键词

属性

c# hidden-features

1475
推荐指数
230
解决办法
68万
查看次数

泛型方法中的原始类型转换,无需装箱

在对我们的一个应用程序进行一些分析时,我发现了以下代码:

public TOut GetValue<TIn, TOut>(Func<TIn> getter)
{
    var value = getter();

    // Do some stuff with the value

    return (TOut)Convert.ChangeType(value, typeof(TOut));
}
Run Code Online (Sandbox Code Playgroud)

TInTOut可以是 int、double 或 string。

由于使用 int 或 double 时的装箱,这在分析会话中显示为堆分配的重要来源。的输入值Convert.ChangeType被装箱,因为该方法需要一个对象,并且返回值也出于同样的原因被装箱。

我正在尝试优化此代码,因为此方法用于高吞吐量服务,而这种分配是禁止的。理想情况下,我会将该方法重写为非通用方法,但该 API 被各​​个团队广泛使用,这种规模的重构将需要数月时间。与此同时,我正在尝试缓解这个问题,并找到一种在不更改 API 合约的情况下改善情况的方法。然而我已经为此苦苦挣扎了一段时间,尚未找到解决方案。

您是否知道一种方法,即使是丑陋的方法,在给定方法契约的情况下处理 int -> double 和 double -> int 转换而无需装箱?请注意,我无法更改参数,但我可以添加通用约束(例如where TIn : IConvertible,但这对我没有多大帮助)。

c# boxing

4
推荐指数
1
解决办法
1753
查看次数

标签 统计

c# ×2

boxing ×1

hidden-features ×1