2

我正在尝试为我的 CsvConfiguration 属性调整单例策略。

如果配置已经可用,只需返回配置即可。否则,获取配置并返回相同的内容,我就可以构建此代码。

    public Rootpdf pdfConfiguration
    {
        get
        {
            Rootpdf pdfConfiguration = null;
            try
            {
                if (pdfConfiguration == null)
                {
                    //retrieve the configuration file.
                    //load the configuration and return it!
                }
                else
                {
                    return pdfConfiguration;
                }
            }
            catch (Exception e)
            {
                Log.Error("An error occurred while reading the configuration file.", e);
            }

            return pdfConfiguration;
        }
    }

优点(我希望):每当需要我的 pdfConfiguration 时,如果它已经可用,我可以返回它。无需每次加载配置文件并计算配置。

我的问题:重新锐化器!resharper 告诉代码

   if (pdfConfiguration == null) //The expression is always true.

resharper 真的是一个问题,它不明白我遵循这个单例模式吗?

或者

我根本不遵循单例模式吗?

4

7 回答 7

6

您在 get 子句的顶部将单例设置为 null :

Rootpdf pdfConfiguration = null;
//THIS IS THE PROBLEM.

注意:99% 的情况下,ReSharper您更聪明。我不喜欢它,但这是真的。

于 2013-08-07T08:59:12.813 回答
6

认为您必须使用 getter 之外的局部变量

    private static Rootpdf  _pdfConfiguration ;
    public static Rootpdf pdfConfiguration
    {
        get
        {
            try
            {
                if (_pdfConfiguration == null)
                {
                    //retrieve the configuration file.
                    //load the configuration and return it!
                }
                else
                {
                    return _pdfConfiguration;
                }
            }
            catch (Exception e)
            {
                Log.Error("An error occurred while reading the configuration file.", e);
            }

            return _pdfConfiguration;
        }
    }

当你想要一个单身人士时,我把它变成了一个静态属性......希望它是你所需要的。

于 2013-08-07T09:00:10.000 回答
3

这是您的课程的外观:

public class RootPdf
{
    private static RootPdf instance;

    private RootPdf()
    {
        //retrieve the configuration file.
        //load the configuration and return it! 
    }

    public static RootPdf Instance
    {
        get
        {
            if (instance == null)
            {
                try
                {
                    instance = new RootPdf();
                }
                catch (Exception e)
                {
                    Log.Error("An error occurred while reading the configuration file.", e);
                    return null;
                }
            }
            return instance;
        }
    }
}

以下是您将如何调用该对象:

var pdf = RootPdf.Instance;
于 2013-08-07T09:09:12.547 回答
1

This line: if (pdfConfiguration == null)will always be true due to this line (just before) Rootpdf pdfConfiguration = null;。您需要做的是将最后一行 ( Rootpdf pdfConfiguration = null;) 放在Get方法之外。这将停止每次将变量初始化为 null。

private static Rootpdf pdfConfiguration = null;
public Rootpdf PdfConfiguration
{

    get
    {            
        try
        {
            if (pdfConfiguration == null)
    ....

有关单例模式的更多信息,请参见此处

或者,您可以使用静态构造函数

静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它。

public class Foo {
private static Rootpdf pdfConfiguration = null;
static Foo()
{
    pdfConfiguration = ....
}
public Rootpdf pdfConfiguration
{
    get
    {
        return pdfConfiguration;
    }
 ....
于 2013-08-07T09:01:52.793 回答
1
class MySingletonClass 
{
    private static UserSettings instance = null;

    /// <summary>
    /// Default protected constructor.
    /// </summary>
    protected MySingletonClass()
    {
    }

    /// <summary>
    /// Invoke the singleton instance.
    /// </summary>
    public static MySingletonClass Instance()
    {
        if (instance == null)
            instance = new MySingletonClass();
        return instance;
    }
}

这将被调用/实例化,如

MySingletonClass msc = MySingletonClass.Instance();

您还可以使用访问器/属性来返回实例

public MySingletonInstance Instance
{
    get 
    {
        if (instance == null)
            instance = new MySingletonInstance();
        return instance;
    }
}

调用/实例化的地方

MySingletonClass msc = MySingletonClass.Instance;

我喜欢上面的第一种方法。

我希望这有帮助。

于 2013-08-07T09:05:11.263 回答
1

如前所述,这不是单例模式。

如果您想坚持您描述的想法,那么我会将您的代码更改为:

internal class Config
    {
        private readonly Lazy<Rootpdf> _config;
        public Config()
        {
            _config = new Lazy<Rootpdf>(ReadConfiguration);
        }

        private Rootpdf ReadConfiguration()
        {
            throw new NotImplementedException();
        }


        public Rootpdf pdfConfiguration
        {
            get
            {                
                try
                {
                    return _config.Value;
                }
                catch (Exception e)
                {
                    Log.Error("An error occurred while reading the configuration file.", e);
                }

                return null;
            }
        }
于 2013-08-07T09:10:33.487 回答
0

如今,我认为从 C# 6.0 开始,您可以使用带有属性的初始值,如下所示:

static public Rootpdf pdfConfiguration { get; } = new Func<Rootpdf>(() => {
    //retrieve the configuration file.
    //load the configuration and return it!
    return new Rootpdf();   // Something like this perhaps..?
})();
于 2019-11-07T07:44:54.673 回答