【发布时间】:2021-06-30 14:42:30
【问题描述】:
我在非静态类中使用静态方法,每次调用该静态方法时,都会创建一个对象的新实例
public class BaseMethodsExecuter<T> where T:class
{
public static T Execute(BaseMethodsParams input, BaseBusinessEnum businessEnum)
{
T data=null;
try
{
data = ExecuteMethod(input, businessEnum);
}
catch (Exception ex)
{
}
return data;
}
private static T ExecuteMethod(BaseMethodsParams input, BaseBusinessEnum businessEnum)
{
// this is the line that fell me to thinking
var TypeMethod = typeof(BaseDataAbstract<T>).Assembly.GetTypes().Single(t => t.BaseType==(typeof(BaseDataAbstract<T>)) && !t.IsAbstract && ((BaseDataAbstract<T>)Activator.CreateInstance(t)).BaseBusinessMethod== businessEnum);
var BaseMethod=(BaseDataAbstract<T>)Activator.CreateInstance(TypeMethod);
var data=BaseMethod.GetBaseData(input);
return data;
}
}
以下代码在静态方法中创建对象
((BaseDataAbstract<T>)Activator.CreateInstance(t))
据我所知,Static objects 将其内存块保存在 stack 部分内存中。
是不是意味着每次调用这个方法都会有一个额外的空间被实例化对象占用,再也不会被释放了?
如何从内存中清除静态方法中的对象?
【问题讨论】:
-
你的代码中没有静态对象,只有静态方法。它们都只是普通的类对象(甚至不是结构),将在堆上分配。确实,它们上的标准机器大小字引用将在堆栈上,但一旦您不需要它们就会被释放。
-
As far as i know, Static objects hold their memory blocks in stack part of the memory.你是怎么得出这个结论的? -
一个方法是否是静态的对该函数内部声明/实例化的对象的行为没有有意义的影响。静态方法中的对象将像非静态方法中的对象一样被清理。
-
把对对象的引用想象成一根绳子。在您的情况下,绳索称为
data,您将绳索返回给调用者。呼叫者现在抓住绳子,绳子连接到对象。同一个物体可能附有多条绳索。直到所有绳索都被分离,该对象将在内存中。如果系上绳索并且您处置了该物体,那么拥有绳索并试图使用该物体的人将获得例外。所以即使你离开了方法,仍然需要到对象的绳索所以对象仍然存在并且需要存在,否则为什么要返回它。 -
改变的是绳子的名称。在此方法中,它被称为
data,当方法离开时,名称data将被丢弃,因此堆栈内存被清除。调用者可以使用新名称或不使用新名称调用data,但该名称将存在于该堆栈中,依此类推。
标签: c# memory stack static-methods