c# - 静态成员变量是否可以用于缓存静态类中的值?

标签 c# caching static-methods

我遇到过这段代码,看起来原始开发人员试图使用静态字符串来缓存静态类中的值。

public static class GetStringFromSomeProcess
{
    private static string theAnswer;

    public static string GetString
    {
        get
        {
            if(theAnswer == null)
            {
                theAnswer = GoGetTheAnswerFromALongRunningProcess();
            }
            return theAnswer;
        }
    }
}   

据我所知,这是行不通的,因为您无法实例化 GetStringFromSomeProcess类,GoGetTheAnswerFromALongRunningProcess每次都会被调用GetString用来。我错过了什么吗?

最佳答案

这会很好地工作——只有一个 theAnswer 实例因为它是静态的 - 并且(也因为它是静态的)它可以从公共(public)静态属性访问。这意味着对其所做的任何更改对于访问它的所有代码都是可见的。所以第一次调用GetString将设置 theAnswer为非空,后续调用将不会调用 GetStringFromSomeProcess() .

但是,您发布的解决方案不是线程安全的,因为 GoGetTheAnswerFromALongRunningProcess()可以被多个线程同时调用。

.Net 提供了 Lazy 类来解决这个问题,如下:

public static class GetStringFromSomeProcess
{
    private static readonly Lazy<string> _theAnswer = new Lazy<string>(GoGetTheAnswerFromALongRunningProcess);

    public static string GetString
    {
        get
        {
            return _theAnswer.Value;
        }
    }

    public static string GoGetTheAnswerFromALongRunningProcess()
    {
        return "X";
    }
}

您提供给 Lazy<T> 的构造函数class 一个它可以在需要时调用的方法,以创建它正在包装的对象。在上面的示例中,我传递了 GoGetTheAnswerFromALongRunningProcess给它的构造函数。

另请注意,拥有可能需要很长时间才能返回的属性(property)通常不是一个好主意。最好把它变成一个方法:

public static string GetString()
{
    return _theAnswer.Value;
}

关于c# - 静态成员变量是否可以用于缓存静态类中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43539309/

相关文章:

c# - Environment.CurrentDirectory 设置为 system32;我如何确定在哪里?

php - CodeIgniter - 使用输出缓存时记录有关 session 的错误

javascript - 如何取消编辑/禁用缓存输入(文本类型)值?

caching - 为什么在大多数处理器中,L1 缓存的大小都小于 L2 缓存的大小?

python - 为什么使用 classmethod 而不是 staticmethod?

c# - 将 TDelegate 作为事件的通用接口(interface)?

c# - 延迟的 NUnit 断言消息评估

c# - 从 C++ COM 服务器将 VARIANT 中的 SAFEARRAY 传递给 C# 的异常

java - 基本Java程序: non-static method cannot be referenced from a static context

java - 如何在静态初始化之前做一些事情