C# 类实例内的静态方法-好、坏还是取决于?

C# 类实例内的静态方法-好、坏还是取决于?,c#,asp.net,C#,Asp.net,我有一个旧的guard类,它是由静态方法组成的,是utilty类的典型 然而,最近我开始使用NLog,所以我的守卫现在可以记录和投掷。对于NLog,每个调用类(guard驻留的地方)都会创建自己的记录器,因此,不要使用这样的方法: public static void NotNull<T>(T obj, string param) { if (obj.Equals(null)) throw new ArgumentNullException(param); }

我有一个旧的guard类,它是由静态方法组成的,是utilty类的典型

然而,最近我开始使用NLog,所以我的守卫现在可以记录和投掷。对于NLog,每个调用类(guard驻留的地方)都会创建自己的记录器,因此,不要使用这样的方法:

public static void NotNull<T>(T obj, string param)
{
    if (obj.Equals(null))
        throw new ArgumentNullException(param);
}
public static void NotNull<T>(T obj, string param, Logger logger, LogLevel logLevel)
{
}
publicstaticvoidnotnull(T对象,字符串参数)
{
如果(对象等于(空))
抛出新ArgumentNullException(参数);
}
我有一个签名如下的方法:

public static void NotNull<T>(T obj, string param)
{
    if (obj.Equals(null))
        throw new ArgumentNullException(param);
}
public static void NotNull<T>(T obj, string param, Logger logger, LogLevel logLevel)
{
}
publicstaticvoidnotnull(T对象、字符串参数、日志记录器、日志级别)
{
}
现在,我所有的方法都包含与记录器相关的两个相同的参数,所以我几乎已经决定依赖注入将是一种更好的方法,将记录器传递到构造函数中,并将obj传递到方法中


我的问题是基于我的经验不足-我的新类不会是静态的,但我是否应该将其中的方法保留为静态的?

看起来您根本不需要传入logger。使用静态记录器字段(查看详细信息)以便在类的所有实例中共享该字段是很好的,这并不违背通常的做法。考虑:

public static class Utils
{
    private static readonly ILog Log = LogManager.GetLogger(typeof(Utils));

    public static void NotNull<T>(T obj, string param)
    {
        Log.Debug("Huston, we got a null.");
        if (obj.Equals(null))
            throw new ArgumentNullException(param);
    }
}
公共静态类Utils
{
private static readonly ILog Log=LogManager.GetLogger(typeof(Utils));
公共静态void NotNull(T对象,字符串参数)
{
Debug(“Huston,我们得到一个空值。”);
如果(对象等于(空))
抛出新ArgumentNullException(参数);
}
}

您不必为每个类实例创建记录器的新实例。例如,可以使用一个静态记录器字段,或者一些日志提供程序如果
obj
为null,则您的
NotNull
方法会抛出一个
NullReferenceException
,而不是
ArgumentNullException
@Andrei,如果您没有对每个类使用记录器,关于名称空间,日志没有那么详细。@JohnOhara,每个类!=每个类实例(即每个对象)@Andrei-我明白了,但我仍然需要将其传递到我的静态方法中,不是吗?我明白了您现在所指的Andrei-但在这种情况下,据我所知,仅使用一个记录器,所有错误都会以相同的命名空间记录到日志文件中的日志中,正如MyNameSpace.Utils | MyObj是null只是为了添加到上面-这是一个问题,因为null不是源于Utils,它要么是类A,要么是BAll right,所以您希望记录器在类
t
的名称空间下记录一个条目?是的,您在类My class中获得了Andrei-param MyVar,而不是UtilsOK中的MyVar。首先,我不得不说,我怀疑这是一种明智的方法,但您显然更了解您的用例。我只想在我上面写的代码中的日志消息中添加一个text for类型
T
。但是,您也可以考虑每次调用该方法时创建一个记录器实例,以确保它是正确的类型。或者是的,您可以为记录器使用DI和register factory,然后方法也不能是静态的,因为您不能从静态方法访问非静态字段