【问题标题】:C#: normal and static void with same nameC#:具有相同名称的普通和静态 void
【发布时间】:2013-07-06 14:51:04
【问题描述】:

我想创建一个“日志”类。将有一个用于主要内容的全局记录器。但是当网络部分想要将某些内容记录到自己的记录器时,它应该能够。我的想法:记录器类中的静态记录器实例和具有相同名称的静态 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(同名)

【问题讨论】:

  • 这里有什么问题?
  • 您的解决方案很好,那么您到底想要什么?
  • 如果两者有相同的参数,那么你需要单例

标签: c# class static instance void


【解决方案1】:

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

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

您有两个主要选项来解决此问题:

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

    public class Logger
    {
        public void Log(string message) { ... }
    
        public static void Log(string message, int level) { ... }
    }
    
  2. 遵循'singleton' 模式:

    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;
            }
        }
    }
    

【讨论】:

  • 这不是我想要的!我认为这与我的代码中的问题相同。我想从 Logger 的实例调用 void 日志,并且直接在没有静态 void 的实例的情况下调用它。
【解决方案2】:

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

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 接口的许多实现。例如,您甚至可以考虑将Logger 类设为静态(不实现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 */ }
}

【讨论】:

  • 看起来不错,我试试看!
  • 是这样吗? void ILogger.Log(string message){Console.WriteLine("[INFO] " + message); } 在调用 Logger.log("da shit");它什么都不做!
  • @danbru1211:看起来不错。您是否在 Log() 方法中设置了断点以查看它是否被调用? Console.WriteLine() 可能正在工作,但未达到您的预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2011-09-16
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多