2

私はここに少しばかげたコードを持っています

Async Function GetCoolNumber() As Task(Of Double)
    Dim n = Await GetNumberFromSomeAsyncSource()
    If IsCool(n) Then
        Return n
    End If
    Return Await GetCoolNumber()
End Function

Private Function GetNumberFromSomeAsyncSource() As Task(Of Double)

Private Function IsCool(n As Object) As Boolean

これで再帰は正常に機能し、希望する結果が得られます。もちろん、私の実際のコードはもっと複雑です。しかし、これは悪い習慣と見なされますか?

この方法で無限再帰を行った場合はどうなりますか?何かが吹くでしょうか?私の直感は、スタックを吹き飛ばすのではなく、タスクをヒープにダンプし続けるだろうということです。

4

1 に答える 1

1

私は .NET での通常の再帰を避ける傾向があります。テールコール最適化のサポートには多少のばらつきがあるため、原則として明確に扱います。

ではasync、書き換えにより問題ない場合があります。dotPeek / JustDecompile を使用して確認できます。

IMO 文書化されていない機能への依存を避けるのが最善です。したがって、書き換えが公式に文書化されている場合 (VB.NET 言語標準など)、問題ないと思います。そうでなければ、繰り返し書いてしまいます。

于 2012-10-10T14:13:29.643 に答える