title: Static property - how to properly initialize it?
body: <p>I'm refactoring some code. I've got many reports in my project which use the same data. For example, each of them uses <code>List&lt;Product&gt;</code> which is retrieved via database. </p>
  
  <p>As for now, I have duplicate lines like:</p>
  
  <pre><code>var products = MyDatabase.Products.ToList(); 
  </code></pre>
  
  <p>I'd like to have a static class with static properties that my reports can use.</p>
  
  <p>I want to have a final line in the report something like:</p>
  
  <pre><code>var products = MyStaticClass.Products; 
  </code></pre>
  
  <p>I'd like to have this list loaded once and enable my reports to use it, instead of referring to the database each time different report wants that list. </p>
  
  <p>I've read about this and the solutions seem to be:</p>
  
  <p>1) </p>
  
  <pre><code>public static List&lt;Product&gt; Products 
  {
      get
      {
          return MyDatabase.Products.ToList(); 
      }
  }
  </code></pre>
  
  <p>2)</p>
  
  <pre><code>public static List&lt;Product&gt; Products { get; set;} = MyDatabase.Products.ToList();
  </code></pre>
  
  <p>3) </p>
  
  <pre><code>public static List&lt;Product&gt; Products = MyDatabase.Products.ToList();
  </code></pre>
  
  <p>4) </p>
  
  <pre><code>private static  List&lt;Product&gt; _products;
  
  public static List&lt;Product&gt; Products
  {
      get 
      { 
          return _products ?? 
              ( _products = MyDatabase.Products.ToList()); 
      }
  }
  </code></pre>
  
  <p>5.</p>
  
  <pre><code>private static Lazy&lt;List&lt;Product&gt;&gt; _products =
      new Lazy&lt;List&lt;Product&gt;&gt;(() =&gt; MyDatabase.Products.ToList());
  
  public static List&lt;Product&gt; Products
  {
      get { return _products.Value; }
  }
  </code></pre>
  
  <p>As I've understood, the first case calls the <code>MyDatabase.Products.ToList()</code> each time I access it, so It's not the desired behaviour.</p>
  
  <p>The second option is almost like the first one. Is there any difference? Or just a newer version of the 1st one.</p>
  
  <p>The third option means calling this <code>MyDatabase.Products.ToList()</code> only once, but it will always be called, independent of actual usage. Close, I guess.</p>
  
  <p>Are 4th or 5th option superior to those above? Is <code>Lazy&lt;T&gt;</code> the best to use in my case? Will it load the data only when called (if called)?</p>
  
  <p>Please clarify if I understand those options correctly and suggest me the perfect solution.</p>