c#新类实例与调用方法之间的内存差异

c#新类实例与调用方法之间的内存差异,c#,class,methods,instantiation,C#,Class,Methods,Instantiation,我正在c#应用程序中构建一个日志系统。目前,我有一个我调用的日志记录方法,该方法写入日志文件。e、 g Log("Hello World"); new WriteLog {Message="Hello World"}; 我想做的是编写一个类,而不是每次我想记录一些东西时都实例化它,构造函数会写入日志文件。e、 g Log("Hello World"); new WriteLog {Message="Hello World

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

Log("Hello World");
new WriteLog {Message="Hello World"};

我想做的是编写一个类,而不是每次我想记录一些东西时都实例化它,构造函数会写入日志文件。e、 g

Log("Hello World");
new WriteLog {Message="Hello World"};
这样做的原因是参数更灵活


但是,我想知道每次记录某个内容时实例化一个类是否比调用该方法占用更多内存。我实例化的每个类是否都会在内存中持久化?

它们暂时会持久化,但会被垃圾收集器及时删除。无论如何,除非你在短时间内打了很多电话,否则这不会对记忆造成更大的影响

然而,我怀疑这是否是一个很好的类用法。在我看来,你误用了一个构造函数,我认为它不会与你的代码一起工作。构造函数应该启动数据,而不是执行诸如日志数据之类的操作。同样在您的示例中,在分配属性之前会调用构造函数

我认为真正的问题是,为什么您觉得类在参数方面具有更大的灵活性


可能是你没有试过。这可能是您需要查找的内容。

您可以创建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");
    }
}
使用

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");
    }
}
公共类TestClass:ITestClass
{
专用只读ILogger\u记录器;
公共测试类(ILogger记录器)
{
_记录器=记录器;
}
公共方法()
{
尝试
{
}
捕获(例外情况除外)
{
_logger.LogException(例如,“获取错误”);
}
}

}

“我正在我的c#应用程序中构建一个日志系统”-不要重新发明轮子。改用
Microsoft.Extensions.Logging
。“我实例化的每个类是否都在内存中保持?”-不。只要有对它的引用就行。否则最终会被垃圾回收。最终意味着:可能是2分钟后“构造函数写入日志文件”:这对代码不起作用。构造函数在您设置消息之前运行,那么您会记录什么呢?如果我必须使用一个日志库,该库要求我在第二个解决方案中写入所有不必要的字符,我会立即将其丢弃并使用另一个。日志记录在某些用例中非常常见,有几十个日志记录将不可避免地使代码变得混乱。我还想说,如果您可以避免构造函数中与IO相关的内容,通常应该这样做。另外,AFAIK,你不能使构造函数异步。他似乎想用构造函数发送日志消息,而构造函数会写入日志文件。当你使用new时,构造函数总是被调用的,但是他的属性赋值会在构造函数被调用后发生。谢谢@Achtung这正是我所需要的。回答了我的问题并提出了正确的解决方案。