gpt4 book ai didi

c# - 如何避免值类型的装箱

转载 作者:行者123 更新时间:2023-11-30 14:09:19 26 4
gpt4 key购买 nike

假设我有一些调用 Func 的类基于传递给它的通用类型,我有一个该类所需的公共(public)接口(interface),如下所示:

var r = new Resolver(); 
var i = r.Invoke(10); // invokes some function `Func<int,int>`
var j = r.Invoke("Hello"); // Same, but `Func<string,string>`
var k = r.Invoke(10, 10); // Same but 'Func<int,int,int>`

我有一个这样的实现:

class Resolver {
readonly IDictionary<Type, Func<object, object>> _funcs = new Dictionary<Type, Func<object, object>>();

public Resolver() {
_funcs.Add(typeof(int), o => (int)o*(int)o);
_funcs.Add(typeof(string), o => (string)o + (string)o);
// and so on;
}

public T Invoke<T>(T t1) {
return (T) _funcs[typeof (T)](t1);
}

public T Invoke<T>(T t1, T t2) {
return (T)_funcs[typeof(T)](t1);
}
}

但由于 Func<,> 的内部实现引起的装箱,值类型的性能非常糟糕有object作为通用类型。

有没有办法实现我想要的公共(public)接口(interface),避免对值类型进行装箱?我也不介意实现中的静态类型安全,但可以没有。

最佳答案

您可以执行以下简单技巧(与您当前的实现相比类型安全性不高):

class Resolver
{
readonly IDictionary<Type, object> _unaryFuncs = new Dictionary<Type, object>();
readonly IDictionary<Type, object> _binaryFuncs = new Dictionary<Type, object>();

public Resolver()
{
_unaryFuncs.Add(typeof(int), new Func<int, int>(o => o * o));
_unaryFuncs.Add(typeof(string), new Func<string, string(o => o + o));
_binaryFuncs.Add(typeof(int), new Func<int, int, int>((x, y) => x + y));
// and so on;
}

public T Invoke<T>(T t1)
{
var f = _unaryFuncs[typeof(T)] as Func<T, T>;
return f(t1);
}

public T Invoke<T>(T t1, T t2)
{
var f = _binaryFuncs[typeof(T)] as Func<T, T, T>;
return f(t1, t2);
}
}

你可能想添加一些错误检查,比如检查那个

  1. 一个 T 函数在从字典中获取之前被注册。
  2. as 转换后它不是 null

并添加类型安全的注册函数:

public void Register<T>(Func<T, T> unaryFunc)
{
_unaryFuncs[typeof(T)] = unaryFunc;
}

public void Register<T>(Func<T, T, T> binaryFunc)
{
_binaryFuncs[typeof(T)] = binaryFunc;
}

关于c# - 如何避免值类型的装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29997500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com