c# new class 实例与调用方法之间的内存差异
memory difference between c# new class instance vs calling method
我正在我的 C# 应用程序中构建一个日志系统。目前我有一个日志记录方法,我调用它写入日志文件。例如
Log("Hello World");
我想做的是写一个 class 而不是每次我想记录一些东西时实例化,然后构造函数写入日志文件。例如
new WriteLog {Message="Hello World"};
这样做的原因是参数更灵活。
但是我想知道每次记录内容时实例化 class 是否比调用该方法需要更多的内存成本。我实例化的每个 class 是否都保留在内存中?
它们暂时会保留下来,但会被垃圾收集器及时删除。无论如何,除非你在短时间内进行了非常多的调用,否则这不会对内存产生任何更大的影响。
不过我确实质疑 class 这是否是一个很好的用法。正如我所见,您正在误用构造函数,我认为它不适用于您的代码。构造函数应该启动数据,而不是执行诸如日志数据之类的操作。同样在您的示例中,在您分配属性之前调用构造函数。
我认为真正的问题是为什么你觉得 class 在参数上更灵活。
难道你没试过named arguments and optional arguments。这可能是您想要查找的内容。
您可以创建一个记录器的扩展class,您可以在项目中使用记录器来记录异常或信息。
示例代码
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");
}
}
}
我正在我的 C# 应用程序中构建一个日志系统。目前我有一个日志记录方法,我调用它写入日志文件。例如
Log("Hello World");
我想做的是写一个 class 而不是每次我想记录一些东西时实例化,然后构造函数写入日志文件。例如
new WriteLog {Message="Hello World"};
这样做的原因是参数更灵活。
但是我想知道每次记录内容时实例化 class 是否比调用该方法需要更多的内存成本。我实例化的每个 class 是否都保留在内存中?
它们暂时会保留下来,但会被垃圾收集器及时删除。无论如何,除非你在短时间内进行了非常多的调用,否则这不会对内存产生任何更大的影响。
不过我确实质疑 class 这是否是一个很好的用法。正如我所见,您正在误用构造函数,我认为它不适用于您的代码。构造函数应该启动数据,而不是执行诸如日志数据之类的操作。同样在您的示例中,在您分配属性之前调用构造函数。
我认为真正的问题是为什么你觉得 class 在参数上更灵活。
难道你没试过named arguments and optional arguments。这可能是您想要查找的内容。
您可以创建一个记录器的扩展class,您可以在项目中使用记录器来记录异常或信息。
示例代码
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");
}
}
}