繁体   English   中英

C#:同名的普通和静态void

[英]C#: normal and static void with same name

我想创建一个“日志”类。 将有一个主要的全局记录器。 但是当网络部分希望将某些内容记录到其自己的记录器中时,它应该可以。 我的想法是:logger类中的一个静态logger实例和一个具有相同名称的静态void来记录某些内容。 例:

Logger.log("ahaha");

将一些东西记录到主记录器中,

new logger().log("kdsjfklsjd");

将登录到特殊记录器。 这是我班级的代码:

public class Logger
{
    public static Logger GlobalLogger = new Logger();

    public Logger()
    {
    }

    public void log(string message)
    {
    }

    public static void log(string message)
    {
        Logger.GlobalLogger.log(message);
    }
}

我想告诉代码,当我想要Logger.GlobalLogger.log(message)时,应使用非静态void(具有相同的名称)

你不能那样做。 您会得到编译器错误:

类型“ Logger”已经定义了具有相同参数类型的名为“ Log”的成员

您可以通过以下两种主要方法解决此问题:

  1. 用不同的参数定义静态方法:

     public class Logger { public void Log(string message) { ... } public static void Log(string message, int level) { ... } } 
  2. 遵循“单例”模式:

     public class Logger { public void Log(string message) { ... } private static Logger globalLogger; public static Logger GlobalLogger { get { if (globalLogger == null) { globalLogger = new Logger(); } return globalLogger; } } } 

解决该编译器错误的一种方法是添加一个接口:

public interface ILogger {
    void Log(string message);
}

public class Logger : ILogger {
    public static readonly ILogger GlobalLogger = new Logger();

    // explicit implementation allows the static and instance Log() to coexist peacefully
    void ILogger.Log(string message) { /* log */ }

    public static void Log(string message) { GlobalLogger.Log(message); }
}

这种模式的一个好处是可以轻松提供ILogger接口的许多实现。 例如,您甚至可以考虑将LoggerILogger静态(不实现ILogger ),并制作一个单独的GlobalLogger类:

public static class Logger {
    public static readonly ILogger Global = new GlobalLogger();

    public static void Log(string message) { Global.Log(message); }
}

public class GlobalLogger : ILogger {
    void Log(message) { /* log */ }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM