Mik*_*ike 4 c# singleton static
我有一个这样的示例代码:
public class SimpleLogger
{
private static SimpleLogger logger;
private string path = null;
protected SimpleLogger(string path)
{
this.path = path;
}
public static SimpleLogger Instance(string path)
{
if (logger == null)
{
logger = new SimpleLogger(path);
}
return logger;
}
public static void Info(string info)
{
string path = $"{logger.path}{DateTime.Now.ToShortDateString()}_Info.txt";
using (StreamWriter writer = new StreamWriter(path))
{
writer.WriteLine($"{DateTime.Now} - {info}");
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时:
SimpleLogger.Instance("path").Info("info");
Run Code Online (Sandbox Code Playgroud)
出现错误:
无法使用实例引用访问成员,请使用类型名称而不是静态方法对其进行限定
但我确实使用了类型名称,不是吗?
但是当我这样称呼它时:
SimpleLogger.Instance("path");
SimpleLogger.Info("info");
Run Code Online (Sandbox Code Playgroud)
它实际上工作得很好。
为了使其内联工作,我必须使 Info 方法成为非静态,然后内联调用也可以正常工作。这是为什么?我不明白这里的机制。有人可以解释一下吗?是因为 Instance 方法返回 SimpleLogger 对象,然后信息需要是非静态的才能在实例而不是类型上工作吗?
在 C# 中,实例方法只能在实例上调用,而静态方法只能在类/结构本身上调用。
为什么你不能链接Info到SimpleLogger.Instance()?
因为SimpleLogger.Instance(...)返回的实例SimpleLogger,并且您尝试对返回值调用静态方法。返回值是 的实例SimpleLogger,因此您不能对其调用静态方法。
通过使其成为Info非静态,您可以在实例上调用它。因此,您可以在 的返回值上调用它Instance()。
您感到困惑的一个原因可能是您在方法链中没有看到 的实例SimpleLogger,因此为了更好地说明链接方法的想法,如下所示:
SimpleLogger.Instance("path").Info("info");
Run Code Online (Sandbox Code Playgroud)
相当于:
SimpleLogger logger = impleLogger.Instance("path");
logger.Info("info");
Run Code Online (Sandbox Code Playgroud)
看到现在的例子了SimpleLogger吗?
正如你所写的那样。您在类上调用静态方法,不能在对象上调用它们,并且您的Instance方法返回该类的具体对象SimpleLogger。如果您想要链接方法(即SimpleLogger.Instance("path").Info("info");),则必须更改Info(string info)为非静态类。让这些方法成为非静态的并让类成为更有意义Singleton