2016-12-30 5 views
0

VB.NETプロパティが取得し、キャッシュ

Public ReadOnly Property Thing(i as long) as double(,) 
    Get 
     Return SomeCalculation(i) 
    End Get 
End Property 

をし、コードが多く回プロパティを呼び出す行った後に(同じで私を取得別のiscenなどと同じです)、新しいiを使用するか、毎回再計算されるまで結果はキャッシュされますか?

ありがとうございます!

+2

毎回再計算されます。キャッシングの自動提供はありません。 – Steve

+0

プロパティは単なる構文的な砂糖であり、1つまたは2つのメソッドとして実装されます。メソッドの結果は暗黙的にキャッシュされません。私はそれがおそらく財産ではなく、むしろ混乱することのない方法でなければならないと言っています。 – jmcilhinney

+0

両方に感謝します。あなたはそれを答えとして入れて、質問に答えがつけられるようにしますか? – Pierre

答えて

1

いいえ繰り返し計算の結果を格納するためにVB.NETに自動キャッシュはありません。何らかのキャッシュを提供するのはあなた次第です。あなたはもちろん辞書

Dim cache As Dictionary(Of Long, Double(,)) = New Dictionary(Of Long, Double(,)) 

Public ReadOnly Property Thing(i as long) as double(,) 
    Get 
     Dim result As Double(,) 
     If Not cache.TryGetValue(i, result) Then 
      result = SomeCalculation(i) 
      cache.Add(i, result) 
     End If 
     Return result 
    End Get 
End Property 

を使用することができる。例えば

は、任意の簡単な解決策として、考慮すべきいくつかのポイントがある:

  • 一切無効化ルールはありません(キャッシュ用アクティブのまま アプリの生涯)
  • これは、同じ入力を計算すると常に同じ結果をもたらすことを前提としています。 同じ入力
+0

'Lazy 'の使用を検討してください。 –

+0

@CodyGray興味深い。私はそれに慣れていない。例を教えてください。 – Steve

+1

'Lazy '型のプライベートバッキング変数を宣言し、 'Lazy '変数の 'Value'メンバを返すpublicプロパティを作成します。例:http://stackoverflow.com/a/2579378/366904およびhttp://stackoverflow.com/questions/5134786/cached-property-vs-lazyt –

1

あなたはこのようにそれを使用する必要がありますキャッシュされた値

Public Class LongCaches(Of MyType) 
    Protected MyDictionary Dictionary(Of Long, MyType) = New Dictionary(Of Long, MyType) 
    Public Delegate Function MyFunction(Of Long) As MyType 
    Protected MyDelegate As MyFunction 
    Public Calculate As Function(ByVal input As Long) As MyType 
     If Not MyDictionary.ContainsKey(input) Then 
      MyDictionary(input) = MyFunction.Invoke(input) 
     End If 
     Return MyDictionary(input) 
    End Function 
    Public Sub New(ByVal myfunc As MyFunction) 
     MyDelegate = myfunc 
    End Sub 
End Caches 

のクラス作成することができます。

Private _MyLongCacheProperty As LongCaches(Of Double(,)) 
Protected ReadOnly MyLongCacheProperty(i As Long) As LongCaches 
Get 
    If _MyLongCacheProperty Is Nothing Then 
     _MyLongCacheProperty = New LongCaches(Of Double(,))(AddressOf SomeCalculation) 
    End If 
    Return _MyLongCacheProperty.Calculate(i) 
End Get 
End Property 

お知らせ:構文エラーがある場合、このコードは、テストされていないし、してください、コメントや編集はdownvoteではなく

関連する問題