首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于回忆录实施的两个问题

关于回忆录实施的两个问题
EN

Stack Overflow用户
提问于 2011-05-07 19:40:38
回答 1查看 412关注 0票数 2

我有这样一门课:

代码语言:javascript
复制
Public NotInheritable Class F
    Private Sub New()
    End Sub
    Public Shared Function Mize(Of TResult)(ByVal f As System.Func(Of TResult)) As System.Func(Of TResult)
        Dim is_new = True
        Dim result As TResult
        Return Function()
                   If is_new Then
                       result = f()
                   End If
                   Return result
               End Function
    End Function
    Public Shared Function Mize(Of T, TResult)(ByVal f As System.Func(Of T, TResult)) As System.Func(Of T, TResult)
        Dim is_new_s = New System.Collections.Generic.List(Of Boolean)
        Dim inputs = New System.Collections.Generic.List(Of T)
        Dim d = New System.Collections.Generic.Dictionary(Of T, TResult)

        Return Function(arg1 As T)
                   If d.ContainsKey(arg1) Then
                       Return d.Item(arg1)
                   Else
                       Dim result = f(arg1)
                       d.Add(arg1, result)
                       Return result
                   End If
               End Function
    End Function End Class

我想知道

1)这是否违反了静态类不应该具有状态的短语?

2)如何修改这些函数,使它们能够接受任何函数(而不是仅适用于F(TResult)F(T, TResult)的上述情况。我的意思是,我可以创建另一个功能,就是:

代码语言:javascript
复制
Function Mize(Of T, T2, TResult)(ByVal f As System.Func(Of T, T2, TResult))
                                                 As System.Func(Of T, T2, TResult)

依此类推,但很明显,它的规模不太好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-07 20:52:36

不可能用任何接受任意数量泛型参数的.NET语言编写泛型函数,因为泛型在.NET中的工作方式。

你最好的选择是:

  1. 为任意数量的参数(比如10或20?)提供了变体,就像System.Func<TResult, T1, T2, T3, ...>那样。
  2. 使用Object作为键(Delegate作为函数),而不是泛型类型。这将降低类型安全性,并可能导致显着的减速,只有在调用DynamicInvoke的成本被函数的速度超过时,您才应该使用它。
  3. 使用不同的语言,比如支持模板的C++、D或Scheme (这不是一个非常容易的选项,但我还是提到了)。

回忆录在某些语言中很容易实现,比如D:

自动回传(别名F,T.)( static ){ auto key = tuple( args);//Pack args成一种静态类型(F(Args))类型( key )缓存;// cache中的字典返回键?cachekey:(cachekey = F(args));}

它可以很容易地使用,比如:

result = memoize!(func)(args);//调用args的回忆录“func”

不,您的示例并不违反状态原则,因为静态类不包含状态!(您实际上每次都捕获一个局部变量,而不是重用以前的任何内容。)不过,我的有。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5923561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档