我有这样一门课:
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)的上述情况。我的意思是,我可以创建另一个功能,就是:
Function Mize(Of T, T2, TResult)(ByVal f As System.Func(Of T, T2, TResult))
As System.Func(Of T, T2, TResult)依此类推,但很明显,它的规模不太好。
发布于 2011-05-07 20:52:36
不可能用任何接受任意数量泛型参数的.NET语言编写泛型函数,因为泛型在.NET中的工作方式。
你最好的选择是:
System.Func<TResult, T1, T2, T3, ...>那样。Object作为键(Delegate作为函数),而不是泛型类型。这将降低类型安全性,并可能导致显着的减速,只有在调用DynamicInvoke的成本被函数的速度超过时,您才应该使用它。回忆录在某些语言中很容易实现,比如D:
自动回传(别名F,T.)( static ){ auto key = tuple( args);//Pack args成一种静态类型(F(Args))类型( key )缓存;// cache中的字典返回键?cachekey:(cachekey = F(args));}
它可以很容易地使用,比如:
result = memoize!(func)(args);//调用args的回忆录“func”
不,您的示例并不违反状态原则,因为静态类不包含状态!(您实际上每次都捕获一个局部变量,而不是重用以前的任何内容。)不过,我的有。
https://stackoverflow.com/questions/5923561
复制相似问题