2017-02-24 11 views
2

私はgetterが最初にその値を読み込むべきプロパティを持っています。二回目は、それは再びそれをロードせずにロードされた値を返す:VB.NETでロードプロパティの遅延読み込み

private Object _MemberValue; 

public Object MemberValue 
{ 
    get 
    { 
     if(_MemberValue == null) 
     { 
      _MemberValue = LoadMember(); 
     } 

     return _MemberValue; 
    } 
} 

Staticキーワードあります。それを使用すると、クラス全体のメンバーを宣言する必要はありません。

Public Property MemberValue as Object 
    Get 
     Static value as Object = Nothing 

     If (value is Nothing) Then 
      value = LoadMember() 
     End If 

     Return value 
    End Get 
End Property 

C#では、このようなキーワードはありません。

この問題や他のパターンのC#実装が優れていますか?

+2

[ 'Static'が悪い使用して理由を読み推奨。](http://stackoverflow.com/a/7475348/993547) –

+0

レイジーオブジェクトをチェックしてください – Nkosi

+2

最初のスニペットで何が問題になっていますか? –

答えて

7

この問題や他のパターンのC#実装が優れていますか?

おそらくそうではありません。必要に応じてLazy<T>を置き換えることができますが、基本的には最初の例と同じです。 VB.NET has some serious drawbacksStaticを使用しているので、どちらの方法でも使用しません。

あなたがLazy<T>を希望する場合、これは私が使用するものです。

private Lazy<object> _MemberLazy = new Lazy<object>(LoadMember); 

public object MemberValue 
{ 
    get 
    { 
     return _MemberLazy.Value; 
    } 
} 
+3

ああ、私はVB.NETの 'Static'の誤解で皆さんを助けようとして以来、私はdownvoteに値すると思います。 –

+3

誰かがシステムを酷使して、アップヴォートを持っています。 –

+1

誰かがこの質問のフィールドデーをしています。明らかに質問や回答が好きではありません。 +1私からしかし。 – Bugs

4

あなたの最初のアプローチは適切と思われますが、私は別の何かをする理由はありませんでした。もしゲットの外側に潜在的に書き込まれる可能性のあるクラスレベルのフィールドを避けるのがあなたの目標なら、おそらくthisのようなものが動作するでしょう。同様に動作する他の多くのReadOnly、WriteOnce、SetOnceの実装があります。それは完璧ではない

ReadOnlyField.cs

public class ReadOnlyField<T> 
{ 
    private bool _frozen; 
    private T _value; 

    public T Value 
    { 
     get { return _value; } 
     set 
     { 
      if (_frozen) 
       throw new InvalidOperationException(); 

      _value = value; 
     } 
    } 

    public void Freeze() 
    { 
     _frozen = true; 
    } 
} 

YourObject.cs

public class YourObject 
{ 
    private readonly ReadOnlyField<object> _someMember; 

    public object MemberValue 
    { 
     get 
     { 
      if(_someMember.Value == null) 
      { 
       _someMember.Value = LoadMember(); 
       _someMember.Freeze(); 
      } 

      return _someMember.Value; 
     } 
    } 

    public YourObject() 
    { 
     _someMember = new ReadOnlyField<object>(); 
    } 
} 

。 VB.Netの例とは異なります。ゲッターの外にあるコードがまずフィールドに書き込むことができますが、少なくともFreezeが呼び出された後は上書きされないように保護されています。

+2

私は投票しませんでしたが、Lazy が何を複製しているかのように思えます。これは.NET 4で始まりました。 –

+0

@the_lotus Lazyには独自の制限があります。質問は不明で、現実的ではない。負荷は他の変数の関数である可能性があり、UIや他のイベントからリフレッシュする必要があるかもしれません。 –