C# 属性在使用静态单例时未获得附加值

C# 属性在使用静态单例时未获得附加值,c#,wcf,C#,Wcf,我有一个包含其他类属性的类“Instances.cs”。该类仅使用静态单例初始化一次。此外,每个属性在get{}内都有一个检查,该检查在该属性为null时创建该属性的新实例。我的问题是,当我试图向这些属性中的任何一个添加一些值时,它们只是保持为null。还有一件事需要提到的是,这些类被放入我的服务解决方案中,并由服务实例“SVC”访问。我可能做错了什么。。我将感谢任何帮助 Instance.cs放置所有属性的位置: public class Instances { private SVC

我有一个包含其他类属性的类“Instances.cs”。该类仅使用静态单例初始化一次。此外,每个属性在get{}内都有一个检查,该检查在该属性为null时创建该属性的新实例。我的问题是,当我试图向这些属性中的任何一个添加一些值时,它们只是保持为null。还有一件事需要提到的是,这些类被放入我的服务解决方案中,并由服务实例“SVC”访问。我可能做错了什么。。我将感谢任何帮助

Instance.cs放置所有属性的位置:

public class Instances
{
    private SVC.User _user;
    private static Instances instance;

    public Instances()
    {
    }

    /// <summary>
    /// Singleton instance for this class
    /// </summary>
    public static Instances Get
    {
        get
        {
            return (instance != null) ? instance : new Instances();
        }
        set
        {
            instance = value;
        }
    }

    /// <summary>
    /// Property that is always null
    /// </summary>
    public SVC.User User
    {
        get
        {
            return (this._user != null) ? this._user : new SVC.User();
        }
        set
        {
            this._user = value;
        }
    }
}
Instances.Get.User.Username = txtAdminName.Text;
Instances.Get.User.IsAdmin = true;

还有一件事需要提及,该用户类包含属性:Username(string)和isAdmin(bool)。

如果没有显式设置
Get
属性,它每次都返回不同的实例(因为它不存储新创建的实例)

您应该这样实现它:

return instance ?? (instance = new Instances());
顺便说一句,为了让你的班级成为一个合适的单身汉,你应该:

  • 使构造函数私有化
  • 删除
    Get
    属性的setter
而且,
Get
对于属性来说是一个非常糟糕的名字。单例实例的常用名称包括
instance
Default


Jon Skeet对singleton模式的一个很好的解读:如果没有显式设置
Get
属性,它每次都返回一个不同的实例(因为它不存储新创建的实例)

您应该这样实现它:

return instance ?? (instance = new Instances());
顺便说一句,为了让你的班级成为一个合适的单身汉,你应该:

  • 使构造函数私有化
  • 删除
    Get
    属性的setter
而且,
Get
对于属性来说是一个非常糟糕的名字。单例实例的常用名称包括
instance
Default


Jon Skeet对singleton模式的一个很好的解读:这不是一个singleton,因为您可以创建同一类的多个实例。 试试这个:

public static Instances Get
{
   get { return instance ?? (instance = new Instances()); }
}

这不是单例,因为您可以创建同一类的多个实例。 试试这个:

public static Instances Get
{
   get { return instance ?? (instance = new Instances()); }
}

啊。。是的,你是对的,正如你所展示的那样,我更改了Get和User属性,现在可以使用了,谢谢@Thomas Levesque:)啊。。是的,你是对的,正如你所展示的那样,我更改了Get和User属性,现在可以使用了,谢谢@Thomas Levesque:)