我遇到过这段代码,看起来原始开发人员试图使用静态字符串来缓存静态类中的值。
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/