所以,使用全新的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;
}
我的问题是:
(它看起来可能类似于this question,但它不是)
答案 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关于singletons和static constructors/type initializers的文章将提供更多信息。