单例属性

问题描述 投票:0回答:7

好吧,如果我创建一个单例类并通过公共静态属性公开单例对象......我明白了。

但是我的单例类还有其他属性。 这些应该是静态的吗? 这些也应该是私人的吗?

我只想通过这样做能够访问我的单例类的所有属性:

MySingletonClass.SingletonProperty.SomeProperty2

SingletonProperty 返回单个单例实例。 我想我的问题是,如何公开单例类中的其他属性..将它们设为私有,然后通过公共单例静态属性访问它们?

或者单例的所有其他属性和方法都应该是公共非静态的吗?

c# design-patterns singleton
7个回答
28
投票

一旦获得

SingletonProperty
(这是对象的单个实例),之后的任何内容都可以像创建要实例化的类一样实现,因为单例实际上是常规对象的单个实例。

例如,下面的 Singleton(显然不是最好的 Singleton 设计,但请耐心等待)提供了两个公共属性,称为 Value 和 Name:

public class MySingleton
{
    private static MySingleton _instance;    

    private MySingleton() { }

    public static MySingleton Instance
    {
        get
        {
            if(_instance == null)
                _instance = new MySingleton();

            return _instance;
        }
    }

    // Your properties can then be whatever you want
    public string Value { get; set; }

    public string Name { get; set; }
}

访问这些属性看起来像:

MySingleton.Instance.Name = "StackOverflow";

MySingleton.Instance.Value = "Rocks!";

3
投票

像对待任何其他类一样将它们设为公共属性。使用单例模式与此无关。


3
投票

不,让它们公开。由于该类只能有一个实例,因此访问这些属性的唯一方法是通过单个实例。


2
投票

只要它们不是静态的,您就需要一个对象实例来访问该属性。如果创建对象实例的唯一方法是通过单例模式,那么类属性本质上是单个类实例的一部分。没有什么特别需要的。


1
投票

它们应该是非静态公共属性。

这样想。你是这个类的一个实例 - 但仍然是一个实例。

因此,您将构造函数设为私有,并创建一个处理延迟实例化的静态属性。

所有其他属性、成员和方法都应该是实例的一部分 - 您现在确保的实例将是唯一的。


0
投票

您的

MySingletonClass.SingletonProperty
返回对Singleton类的实例的引用。因此,您可以像使用类的任何其他实例一样使用公共属性(和方法等)。

MySingletonClass.SingletonProperty.SomeProperty2

当您将

SomeProperty2
设为静态时,您可以执行以下操作(但这不符合单例设计模式的精神):

MySingletonClass.SomeProperty2

0
投票

在较新版本的 C# 中,你可以这样写:

private static MyObject _instance;
public static MyObject Instance
{
    get => _instance ??= new();
}

基本上,您可以为

_instance
if 分配一个值,并且您将返回 _instance ,它要么已经有一个值,要么刚刚被分配了一个新值。更干净

© www.soinside.com 2019 - 2024. All rights reserved.