【问题标题】:memory difference between c# new class instance vs calling methodc#新类实例与调用方法之间的内存差异
【发布时间】:2020-07-24 11:39:51
【问题描述】:

我正在我的 c# 应用程序中构建一个日志系统。目前我有一个我调用的日志记录方法,它写入日志文件。例如

Log("Hello World");

我想做的是写一个类,而不是每次我想记录一些东西时实例化,然后构造函数写入日志文件。例如

new WriteLog {Message="Hello World"};

这样做的原因是参数更灵活。

但是,我想知道每次记录某些内容时实例化一个类是否比调用该方法具有更多的内存成本。我实例化的每个类是否都保留在内存中?

【问题讨论】:

  • “我正在我的 c# 应用程序中构建一个日志系统”——不要重新发明轮子。请改用Microsoft.Extensions.Logging
  • "我实例化的每个类是否都保留在内存中?" - 不。只要有对它的引用。否则最终会被垃圾回收。最终意味着:可以在 2 分钟后
  • “并且构造函数写入日志文件”:这不适用于您的代码。构造函数运行之前你设置消息,那么你会记录什么?
  • 如果我必须使用一个日志库,该库需要我编写您在第二个解决方案中拥有的所有不必要的字符,我会立即将其丢弃并使用另一个。在某些用例中,日志记录可能非常常见,并且有几十个这样的记录不可避免地会使代码混乱。
  • 另外我想说,如果你可以避免在构造函数中与 IO 相关的东西,你通常应该这样做。你也不能让构造函数异步,AFAIK。

标签: c# class methods instantiation


【解决方案1】:

它们会暂时保留,但会被垃圾收集器及时删除。无论如何,除非您在短时间内拨打非常多的电话,否则这不会对内存产生更大的影响。

然而,我确实质疑这是否是一个类的好用法。正如我所见,您正在使用构造函数,我认为它不适用于您的代码。构造函数应该启动数据,而不是执行诸如日志数据之类的操作。同样在您的示例中,在分配属性之前调用构造函数。

我认为真正的问题是为什么你觉得一个类在参数上具有更大的灵活性。

你可能没有尝试过named arguments and optional arguments。这可能是您可能想要查找的内容。

【讨论】:

  • 他似乎想使用构造函数发送日志消息并且构造函数写入日志文件。构造函数总是在你使用new的时候被调用,但是他的属性赋值会在构造函数被调用之后发生。
  • 谢谢@Achtung 这正是我所需要的。回答了我的问题并提出了正确的解决方案。
【解决方案2】:

您可以创建一个Logger类的扩展,您可以在项目中使用logger来记录异常或信息。

示例代码

public static class LoggerExtensions
{
    public static void LogCustomError(this ILogger logger, string message, params object[] args) => logger.LogError(message, args);
    public static void LogCustomError(this ILogger logger, Exception exception, string message, params object[] args) => logger.LogException(exception, message, args);

}

使用

public class TestClass : ITestClass
{
private readonly ILogger<ITestClass> _logger;

public TestClass(ILogger<TestClass> logger)
{
    _logger = logger;
}

public voidTesMethod()
{
    try
    {

    }
    catch (Exception ex)
    {
        _logger.LogException(ex, "Got error");
    }
}

}

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2011-03-15
    • 2010-09-07
    • 1970-01-01
    • 2012-06-03
    • 2020-11-04
    • 2020-12-14
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多