自动属性初始化器Singleton实现

时间:2015-09-23 11:24:57

标签: c# .net singleton automatic-properties c#-6.0

所以,使用全新的C#6,我们得到了那些整洁的自动属性初始化器。我想我也可以利用这些来制作比以往更简洁的单身人士。显然someone else也有这个想法。

<?php

/**
 * @ORM\Table(name="ingredient")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Ingredient
{

    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="decimal", scale=2, nullable=true)
     */
    private $prix;

    /** 
     * @ORM\OneToMany(targetEntity="\My\AcmeBundle\Entity\RecetteIngredientAssociation", mappedBy="ingredient") 
     */
    protected $recette_ingredient_associations;

}

我的问题是:

  1. 它的线程安全性如何?
  2. 它是多么懒惰,或实际创建实例的时间? (不是优先事项,但对未来的参考会有好处)
  3. 总体来说这是一个好主意吗?
  4. (它看起来可能类似于this question,但它不是)

1 个答案:

答案 0 :(得分:7)

您的代码将扩展为以下内容:

public sealed class Singleton
{
    private static readonly Singleton <Instance>k__BackingField = new Singleton();
    public static Singleton Instance { get { return <Instance>k__BackingField; } }
    private Singleton() { /* some initialization code */ }
}

<Instance>k__BackingField是编译器生成的字段的unspeakable name。)

因此,代码的属性将与上面的代码完全相同。也就是说,这种模式是线程安全的,根据具体情况,它可能是一个好主意。

假设您在访问Instance之前没有访问此类型的任何其他静态成员,那么确切的懒惰程度取决于运行时。通常,它会像“实例是第一次创建 访问Instance的方法是JIT编译的”,但您对此没有任何保证。< / p>

如果要确保在第一次访问Instance之前创建实例,请在类中添加一个空的静态构造函数。 (这可能会对性能产生很小的负面影响,但这对您来说可能无关紧要。)

由于大部分内容并非真正针对C#6,因此Jon Skeet关于singletonsstatic constructors/type initializers的文章将提供更多信息。