“无法使用实例引用访问成员,而是使用类型名称对其进行限定”并且我确实使用类型名称

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 对象,然后信息需要是非静态的才能在实例而不是类型上工作吗?

Swe*_*per 7

在 C# 中,实例方法只能在实例上调用,而静态方法只能在类/结构本身上调用。

为什么你不能链接InfoSimpleLogger.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吗?


Cal*_*zar 5

正如你所写的那样。您在类上调用静态方法,不能在对象上调用它们,并且您的Instance方法返回该类的具体对象SimpleLogger。如果您想要链接方法(即SimpleLogger.Instance("path").Info("info");),则必须更改Info(string info)为非静态类。让这些方法成为非静态的并让类成为更有意义Singleton