c# - 你能避免在内存通用方法中拆箱吗?

标签 c# generics boxing memoization

我有一个通用方法,用于内存数据库中字符串值到实际转换值的转换。

public MySpecialValue {
    object val;
    bool valSet = false; 

    T GetValue<T> () { 
         if (!valSet)
         {
                val = (T)Convert.ChangeType(DatabaseValue, typeof(T));
                valSet = true;
         }
         return (T)val;
     }

     public string DatabaseValue { get; set; }
}

问题是在初始化期间我不知道数据库中的数据是什么类型,只有在第一次调用时我才能做出这个决定。

有没有什么方法可以构造它,使其不会被迫拆箱缓存的值类型? (不改变包含类的签名)

最佳答案

您提供的代码有些奇怪。 “DoSomethingExpensive”如何知道为任意 T 返回 T ?这对我来说毫无意义。

您通常编写通用内存器的方式是这样的:

public static Func<T> Memoize(this Func<T> func)
{
    bool executed = false;
    T result = default(T);
    Func<T> memoized = ()=> 
    {
        if (!executed)
        {
            result = func();
            executed = true;
        }
        return result;
    };
    return memoized;
}

现在你可以说:

Func<int> expensive = DoSomethingExpensiveThatGetsAnInt;
Func<int> memoized = expensive.Memoize();

你就完成了。无需装箱。

关于c# - 你能避免在内存通用方法中拆箱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730838/

相关文章:

c# - 使用kinect使播放器剪切图像更平滑,特殊抗锯齿

Java参数化方法返回值类型

ios - Swift 泛型函数问题。减少重复代码

generics - 为什么在mockito 2中使用 "doAnswer"时getArgument()不会隐式转换?

java - 将整数值分配给Java中的Float包装器

Kotlin 盒装​​ Int 不一样

c# - 对不同语言/体系结构/操作系统中相对较小的数字取对数

c# - 在 C# 中使用正则表达式提取字符串的逗号分隔部分

c# - 进程启动是否使用另一个线程?

c# - 为什么 ((object)(int)1).Equals(((object)(ushort)1)) 产生错误?